Как определить, содержит ли массив JavaScript объект с атрибутом, равным заданному значению
У меня есть массив, например:
vendors = [{
Name: 'Magenic',
ID: 'ABC'
},
{
Name: 'Microsoft',
ID: 'DEF'
} // и так далее...
];
Как мне проверить, существует ли "Magenic" в этом массиве? Я бы не хотел использовать цикл, если это не обязательно. Я работаю с потенциально несколькими тысячами записей.
5 ответ(ов)
Не нужно использовать цикл. Есть три метода, которые приходят на ум:
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: Нет причин использовать нестрогую равенство () вместо строгого (=) при проверке имени.
Вот как я бы это сделал:
const found = vendors.some(item => item.Name === 'Magenic');
Метод array.some()
проверяет, есть ли хотя бы одно значение в массиве, соответствующее заданному критерию, и возвращает булевое значение. Далее вы можете сделать так:
if (found) {
// сделать что-то
} else {
// сделать что-то другое
}
Если вы не хотите изменить структуру данных на такую:
vendors = {
Magenic: {
Name: 'Magenic',
ID: 'ABC'
},
Microsoft: {
Name: 'Microsoft',
ID: 'DEF'
}
// и так далее...
};
то вам придется использовать цикл для доступа к данным, например:
for (const vendor in vendors) {
if (vendors[vendor].Name === 'Magenic') {
// Ваш код для обработки
}
}
С помощью такого цикла вы сможете обрабатывать информацию о каждом продавце и делать проверки.
В JavaScript массив имеет два метода — some
и every
, которые возвращают логическое значение и могут помочь вам решить вашу задачу.
На мой взгляд, метод some
будет наиболее подходящим для вашей цели.
vendors.some(vendor => vendor['Name'] !== 'Magenic')
Метод some
проверяет, удовлетворяет ли хотя бы один из объектов в массиве заданному условию.
vendors.every(vendor => vendor['Name'] !== 'Magenic')
Метод every
проверяет, удовлетворяют ли все объекты в массиве заданному условию.
Вы не сможете сделать это, не заглянув в объект.
Вам, вероятно, стоит немного изменить структуру, например:
vendors = {
Magenic: 'ABC',
Microsoft: 'DEF'
};
Тогда вы сможете использовать его как хэш для поиска.
vendors['Microsoft']; // 'DEF'
vendors['Apple']; // undefined
Как перемешать (сделать случайным) массив в JavaScript?
Как объединить два массива в JavaScript и удалить дубликаты?
Как очистить массив в JavaScript?
Как удалить все дубликаты из массива объектов?
Выбор последнего элемента в массиве JavaScript