Как найти значение в многомерном объекте / массиве в Javascript?



У меня есть многомерный объект (это в основном массив):



Object = {
1 : { name : bob , dinner : pizza },
2 : { name : john , dinner : sushi },
3 : { name : larry, dinner : hummus }
}


Я хочу иметь возможность искать объект / массив, где ключ "ужин", и посмотреть, соответствует ли он"суши".



Я знаю, что jQuery имеет $.inArray, но это, кажется, не работает на многомерных массивах. Или, может быть, я ошибаюсь. indexOf также, кажется, работает только на одном уровне массива.



нет ли для этого функции или существующего кода?

1478   7  

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" С помощью map

people.map(function (person) {
  if (person.dinner == "sushi") {
    return person
  } else {
    return null
  }
}); // => [null, { "name": "john", "dinner": "sushi" }, null]

или reduce

people.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;       

}

jsFiddle.

пока -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 в массив:

https://jsfiddle.net/3asvkLn6/1/

здесь уже много хороших ответов, так почему бы не использовать еще одну библиотеку, такую как 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

    Ничего не найдено.