2014-11-04 2 views
0

Учитывая массив объектов, что является лучшим способом найти объект с определенным ключом в JS?Учитывая массив объектов, найдите объект с определенным ключом

Использование jQuery и underscoreJS в порядке. Я просто ищу самый легкий/наименьший код ответа.

Пример: Массив объектов, в которых каждый объект имеет «имя». Найдите объект с определенным «именем».

var people = [{name: "A"}, {name: "B"}, {name: "C"}];

мое текущее решение: проход в массиве, ключ (например, "название"), а значение (например, "С").

function getObject(myArray, searchKey, searchValue) { 
    myArray.forEach(function(element){ 
    if (element[searchKey] == searchValue) { 
     return element; 
    } 
    }); 
} 
+0

Возможно, вам нужен фильтр. – elclanrs

+2

Слишком плохо ES6 пока не поддерживается: 'return arr.find (el => el [searchKey] === searchValue);' –

+0

@ Qantas94Heavy Он все еще в черновике :( – thefourtheye

ответ

2

Вы можете использовать функцию _.where Underscore.js, подобно этому

console.log(_.where(people, { 
    "name": "C" 
})); 
# [ { name: 'C' } ] 

Это возвращает все объекты в массиве, который точно соответствует объект мы перейдем в качестве второго аргумента.

+0

Спасибо @thefourtheye - я согласен ответ, когда таймер вверх. Вы также знаете, как я могу удалить это из массива? Похоже, для удаления требуется, чтобы я знал индекс элемента в массиве. –

+0

@DonnyP Вы можете использовать '_.filter' как показано в других ответах, что даст новый массив без нежелательных элементов. Таким образом, мы можем остановить старый массив и начать использовать новый массив. – thefourtheye

1

Использование _.filter:

var people = [{name: "A"}, {name: "B"}, {name: "C"}]; 

var filteredPeople = _.filter(people, function(obj){ 
    return obj['name'] == 'C'; 
}); 

console.log(JSON.stringify(filteredPeople)) // [{"name":"C"}] 

Если вы хотите массив без согласованного объекта (ов), используйте _.reject:

var filteredPeople = _.reject(people, function(obj){ 
    return obj['name'] == 'C'; 
}); 

console.log(JSON.stringify(filteredPeople)) // [{name: "A"}, {name: "B"}] 
1

Вы должны идти с grep из JQuery

var people = [{name: "A"}, {name: "B"}, {name: "C"}]; 

var obj1= jQuery.grep(people,function(n,i){return (n.name=='A')}) 
0

Без какой-либо пользовательской библиотеки вы также можете это сделать. Пожалуйста, обратите внимание на следующий код

var people = [{name: "A"}, {name: "B"}, {name: "C"}], 
 
    match=function(element){ 
 
     return element.name==="A"; 
 
    }; 
 
console.log(people.filter(match));

Но это своего рода статический код. Я не знаю, как передать ключ и значение функции match().

Смежные вопросы