14

Как определить, содержит ли массив JavaScript объект с атрибутом, равным заданному значению

13

У меня есть массив, например:

vendors = [{
    Name: 'Magenic',
    ID: 'ABC'
  },
  {
    Name: 'Microsoft',
    ID: 'DEF'
  } // и так далее...
];

Как мне проверить, существует ли "Magenic" в этом массиве? Я бы не хотел использовать цикл, если это не обязательно. Я работаю с потенциально несколькими тысячами записей.

5 ответ(ов)

2

Не нужно использовать цикл. Есть три метода, которые приходят на ум:

Array.prototype.some()

Это самый точный ответ на ваш вопрос, т.е. "проверить, существует ли что-то", подразумевающее булев результат. Этот метод вернет true, если есть хотя бы один объект 'Magenic', иначе — false:

let hasMagenicVendor = vendors.some(vendor => vendor['Name'] === 'Magenic');

Array.prototype.filter()

Этот метод вернет массив всех объектов 'Magenic', даже если их всего один (в результате получится массив с одним элементом):

let magenicVendors = vendors.filter(vendor => vendor['Name'] === 'Magenic');

Если вы попытаетесь привести это к булевому значению, это не сработает, так как пустой массив (без объектов 'Magenic') считается правдивым. Поэтому просто используйте magenicVendors.length в вашем условии.

Array.prototype.find()

Этот метод вернет первый объект 'Magenic' (или undefined, если таких нет):

let magenicVendor = vendors.find(vendor => vendor['Name'] === 'Magenic');

Это корректно приводит к булевому значению (любой объект — истинный, undefined — ложный).


Примечание: Я использую vendor["Name"] вместо vendor.Name из-за необычного написания имен свойств.

Примечание 2: Нет причин использовать нестрогую равенство () вместо строгого (=) при проверке имени.

0

Вот как я бы это сделал:

const found = vendors.some(item => item.Name === 'Magenic');

Метод array.some() проверяет, есть ли хотя бы одно значение в массиве, соответствующее заданному критерию, и возвращает булевое значение. Далее вы можете сделать так:

if (found) {
    // сделать что-то
} else {
    // сделать что-то другое
}
0

Если вы не хотите изменить структуру данных на такую:

vendors = {
    Magenic: {
      Name: 'Magenic',
      ID: 'ABC'
    },
    Microsoft: {
      Name: 'Microsoft',
      ID: 'DEF'
    }
    // и так далее...
};

то вам придется использовать цикл для доступа к данным, например:

for (const vendor in vendors) {
    if (vendors[vendor].Name === 'Magenic') {
        // Ваш код для обработки
    }
}

С помощью такого цикла вы сможете обрабатывать информацию о каждом продавце и делать проверки.

0

В JavaScript массив имеет два метода — some и every, которые возвращают логическое значение и могут помочь вам решить вашу задачу.

На мой взгляд, метод some будет наиболее подходящим для вашей цели.

vendors.some(vendor => vendor['Name'] !== 'Magenic')

Метод some проверяет, удовлетворяет ли хотя бы один из объектов в массиве заданному условию.

vendors.every(vendor => vendor['Name'] !== 'Magenic')

Метод every проверяет, удовлетворяют ли все объекты в массиве заданному условию.

0

Вы не сможете сделать это, не заглянув в объект.

Вам, вероятно, стоит немного изменить структуру, например:

vendors = {
    Magenic:   'ABC',
    Microsoft: 'DEF'
};

Тогда вы сможете использовать его как хэш для поиска.

vendors['Microsoft']; // 'DEF'
vendors['Apple']; // undefined
Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь