Поиск совпадающих объектов в массиве объектов?
var set = [{"color":"blue"},{"color":"green"},{"color":"red"},{"color":"green"}];
Я хотел бы иметь возможность делать что-то вроде вызова db, set.find({"color":"green"})
и возвращать массив, полный объектов, которые содержат это свойство.
Ответы
Ответ 1
Используя Array#filter
, для этого конкретного случая код будет выглядеть как
var results = set.filter(function (entry) { return entry.color === "green"; });
Array#filter
не реализован в некоторых старых браузерах, поэтому см. статью, связанную с обратной совместимостью, или еще лучше получить полноценную прошивку ES5.
Для более общего случая это просто вопрос расширения этой идеи:
function findByMatchingProperties(set, properties) {
return set.filter(function (entry) {
return Object.keys(properties).every(function (key) {
return entry[key] === properties[key];
});
});
}
var results = findByMatchingProperties(set, { color: "green" });
Опять же, я использую методы ECMAScript 5 Object.keys
и Array#every
, поэтому используйте ES5. (Код выполнен без прокладки ES5, но использует ручные петли и гораздо менее интересен для записи и чтения).
Ответ 2
Поскольку вы включили тег jQuery, здесь один из способов сделать это с помощью jQuery map
:
var results = $.map( set, function(e,i){
if( e.color === 'green' ) return e;
});
В документации указано, что вам нужно вернуть null
, чтобы удалить элемент из массива, но, по-видимому, это значение false, как показано jsFiddle в комментариях; ничего не возвращает (т.е. возвращение undefined
).
Ответ 3
Я использовал функцию карты из jquery, и я получаю выбранный индекс, пропустив поиск ключевого значения, поэтому, используя этот индекс, мы получим требуемый объект из массива.
var mydata = [{ name: "Ram", Id: 1 }, { name: "Shyam", Id: 2 }, { name: "Akhil", Id: 3 }];
searchKey = 2
var mydata = [{ name: "Ram", Id: 1 }, { name: "Shyam", Id: 2 }, { name: "Akhil", Id: 3 }];
searchKey = 2
var selectedData = mydata[mydata.map(function (item) { return item.Id; }).indexOf(searchKey)];
console.log(selectedData)