У меня есть массив объектов:
Object = {
1 : { name : bob , dinner : pizza },
2 : { name : john , dinner : sushi },
3 : { name : larry, dinner : hummus }
}
Я хочу иметь возможность найти в объекте / массиве ключ «ужин» и посмотреть, соответствует ли он «суши».
Я знаю, что в jQuery есть $ .inArray, но он, похоже, не работает с массивами объектов. А может я ошибаюсь. indexOf также, похоже, работает только на одном уровне массива.
Для этого нет функции или существующего кода?
javascript
jquery
arrays
search
Спрашивающий
источник
источник
Object
в Javascript зарезервированObject
объект-объект, т.е. мать всех объектов.Ответы:
Если у вас есть такой массив, как
var people = [ { "name": "bob", "dinner": "pizza" }, { "name": "john", "dinner": "sushi" }, { "name": "larry", "dinner": "hummus" } ];
Вы можете использовать
filter
метод объекта Array: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" }]
Я уверен, что вы сможете обобщить это на произвольные ключи и значения!
источник
grep
метод jQuery . Возможно, имеет смысл включить ваш ответ, поскольку он такой же, как и то, что вы делаете, но зависит от jQuery и дружелюбен к браузеру.jQuery имеет встроенный метод,
jQuery.grep
который работает аналогичноfilter
функции 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" }]
источник
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
не будет действительным ключом.источник
Если вы собираетесь часто выполнять этот поиск, подумайте об изменении формата вашего объекта, чтобы ужин действительно был ключевым. Это похоже на назначение первичного кластерного ключа в таблице базы данных. Так, например:
Obj = { 'pizza' : { 'name' : 'bob' }, 'sushi' : { 'name' : 'john' } }
Теперь вы можете легко получить к нему доступ следующим образом:
Object['sushi']['name']
Или, если объект действительно такой простой (просто "имя" в объекте), вы можете просто изменить его на:
Obj = { 'pizza' : 'bob', 'sushi' : 'john' }
А затем получить доступ к нему , как:
Object['sushi']
.Очевидно, что не всегда возможно или в ваших интересах реструктурировать ваш объект данных таким образом, но дело в том, что иногда лучший ответ - это подумать о том, структурирован ли ваш объект данных наилучшим образом. Создание такого ключа может быть быстрее и создавать более чистый код.
источник
Найти объект в массиве можно с помощью библиотеки 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:
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 или подчеркивание :)
obj = { 1 : { name : 'bob' , dinner : 'pizza' }, 2 : { name : 'john' , dinner : 'sushi' }, 3 : { name : 'larry', dinner : 'hummus' } } _.where(obj, {dinner: 'pizza'}) >> [{"name":"bob","dinner":"pizza"}]
источник
Мне пришлось искать во вложенной структуре карты сайта первый элемент, который проходит по заданному пути. Я придумал следующий код, просто используя
.map()
.filter()
и.reduce
. Возвращает последний найденный элемент, соответствующий пути/c
.var sitemap = { nodes: [ { items: [{ path: "/a" }, { path: "/b" }] }, { items: [{ path: "/c" }, { path: "/d" }] }, { items: [{ path: "/c" }, { path: "/d" }] } ] }; const item = sitemap.nodes .map(n => n.items.filter(i => i.path === "/c")) .reduce((last, now) => last.concat(now)) .reduce((last, now) => now);
источник
Если вы хотите найти конкретный объект с помощью функции поиска, просто попробуйте что-то вроде этого:
function findArray(value){ let countLayer = dataLayer.length; for(var x = 0 ; x < countLayer ; x++){ if(dataLayer[x].user){ let newArr = dataLayer[x].user; let data = newArr[value]; return data; } } return null; } findArray("id");
Это пример объекта:
layerObj = { 0: { gtm.start :1232542, event: "gtm.js"}, 1: { event: "gtm.dom", gtm.uniqueEventId: 52}, 2: { visitor id: "abcdef2345"}, 3: { user: { id: "29857239", verified: "Null", user_profile: "Personal", billing_subscription: "True", partners_user: "adobe"} }
Код выполнит итерацию и найдет «пользовательский» массив и будет искать объект, который вы ищете внутри.
Моя проблема заключалась в том, что индекс массива менялся при каждом обновлении окна, и он был либо в третьем, либо во втором массиве, но это не имеет значения.
Работал как шарм для Меня!
В вашем примере это немного короче:
function findArray(value){ let countLayer = Object.length; for(var x = 0 ; x < countLayer ; x++){ if(Object[x].dinner === value){ return Object[x]; } } return null; } findArray('sushi');
источник
Я бы старался не изобретать велосипед. Мы используем сканирование объектов для всех наших потребностей в обработке данных. Концептуально это очень просто, но позволяет делать много интересных вещей. Вот как вы решите свой конкретный вопрос
const objectScan = require('object-scan'); const findDinner = (dinner, data) => objectScan(['*'], { abort: true, rtn: 'value', filterFn: ({ value }) => value.dinner === dinner })(data); const data = { 1: { name: 'bob', dinner: 'pizza' }, 2: { name: 'john', dinner: 'sushi' }, 3: { name: 'larry', dinner: 'hummus' } }; console.log(findDinner('sushi', data)); // => { name: 'john', dinner: 'sushi' }
источник