Поиск совпадающих объектов в массиве объектов?

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)