Как найти значение в многомерном объекте / массиве в Javascript?
У меня есть многомерный объект (это в основном массив):
Object = {
1 : { name : bob , dinner : pizza },
2 : { name : john , dinner : sushi },
3 : { name : larry, dinner : hummus }
}
Я хочу иметь возможность искать объект / массив, где ключ "ужин", и посмотреть, соответствует ли он"суши".
Я знаю, что jQuery имеет $.inArray, но это, кажется, не работает на многомерных массивах. Или, может быть, я ошибаюсь. indexOf также, кажется, работает только на одном уровне массива.
нет ли для этого функции или существующего кода?
7 ответов:
если у вас есть массив, например
var people = [ { "name": "bob", "dinner": "pizza" }, { "name": "john", "dinner": "sushi" }, { "name": "larry", "dinner": "hummus" } ];можно использовать
filterметод объекта массива:people.filter(function (person) { return person.dinner == "sushi" }); // => [{ "name": "john", "dinner": "sushi" }]в новых реализациях JavaScript вы можете использовать выражение функции:
people.filter(p => p.dinner == "sushi") // => [{ "name": "john", "dinner": "sushi" }]
вы можете искать людей, которые
"dinner": "sushi"С помощьюmappeople.map(function (person) { if (person.dinner == "sushi") { return person } else { return null } }); // => [null, { "name": "john", "dinner": "sushi" }, null]или
reducepeople.reduce(function (sushiPeople, person) { if (person.dinner == "sushi") { return sushiPeople.concat(person); } else { return sushiPeople } }, []); // => [{ "name": "john", "dinner": "sushi" }]Я уверен, что вы можете обобщить это на произвольный ключи и ценности!
jQuery имеет встроенный метод
jQuery.grepэто работает аналогично ES5 С @adamse это и должен отлично работать на старых браузерах.используя пример Адамса:
var peoples = [ { "name": "bob", "dinner": "pizza" }, { "name": "john", "dinner": "sushi" }, { "name": "larry", "dinner": "hummus" } ];вы можете сделать следующее
jQuery.grep(peoples, function (person) { return person.dinner == "sushi" }); // => [{ "name": "john", "dinner": "sushi" }]
если вы собираетесь часто выполнять этот поиск, подумайте об изменении формата вашего объекта, чтобы ужин на самом деле был ключевым. Это похоже на назначение первичного кластеризованного ключа в таблице базы данных. Так, например:
Obj = { 'pizza' : { 'name' : 'bob' }, 'sushi' : { 'name' : 'john' } }теперь вы можете легко получить к нему доступ следующим образом:
Object['sushi']['name']или если объект действительно такой простой (просто " имя " в объекте), вы можете просто изменить его на:
Obj = { 'pizza' : 'bob', 'sushi' : 'john' }а затем получить к нему доступ, как:
Object['sushi'].очевидно, что не всегда возможно или в ваших интересах реструктурировать объект данных таким образом, но дело в том, что иногда лучший ответ-рассмотреть, структурирован ли ваш объект данных наилучшим образом. Создание такого ключа может быть быстрее и создать более чистый код.
var getKeyByDinner = function(obj, dinner) { var returnKey = -1; $.each(obj, function(key, info) { if (info.dinner == dinner) { returnKey = key; return false; }; }); return returnKey; }пока
-1никогда не является допустимым ключом.
вы можете найти объект в массиве с Alasql библиотека:
var data = [ { name : "bob" , dinner : "pizza" }, { name : "john" , dinner : "sushi" }, { name : "larry", dinner : "hummus" } ]; var res = alasql('SELECT * FROM ? WHERE dinner="sushi"',[data]);попробуйте этот пример в jsFiddle.
Вы можете использовать простой в цикле:
for (prop in Obj){ if (Obj[prop]['dinner'] === 'sushi'){ // Do stuff with found object. E.g. put it into an array: arrFoo.push(Obj[prop]); } }в следующем примере скрипки помещаются все объекты, содержащие
dinner:sushiв массив:
здесь уже много хороших ответов, так почему бы не использовать еще одну библиотеку, такую как lodash или underscore :)
obj = { 1 : { name : 'bob' , dinner : 'pizza' }, 2 : { name : 'john' , dinner : 'sushi' }, 3 : { name : 'larry', dinner : 'hummus' } } _.where(obj, {dinner: 'pizza'}) >> [{"name":"bob","dinner":"pizza"}]
Comments