Mam tablicę obiektów:
Object = {
1 : { name : bob , dinner : pizza },
2 : { name : john , dinner : sushi },
3 : { name : larry, dinner : hummus }
}
Chcę mieć możliwość przeszukania obiektu / tablicy pod kątem klucza „obiad” i sprawdzenia, czy pasuje do „sushi”.
Wiem, że jQuery ma $ .inArray, ale wygląda na to, że nie działa na tablicach obiektów. A może się mylę. indexOf również wydaje się działać tylko na jednym poziomie tablicy.
Czy nie ma do tego żadnej funkcji ani istniejącego kodu?
javascript
jquery
arrays
search
Indagator
źródło
źródło
Object
w JavaScript zastrzeżonyObject
jest obiekt obiekt, czyli matka wszystkich obiektów.Odpowiedzi:
Jeśli masz tablicę, taką jak
var people = [ { "name": "bob", "dinner": "pizza" }, { "name": "john", "dinner": "sushi" }, { "name": "larry", "dinner": "hummus" } ];
Możesz użyć
filter
metody obiektu Array:people.filter(function (person) { return person.dinner == "sushi" }); // => [{ "name": "john", "dinner": "sushi" }]
W nowszych implementacjach JavaScript możesz użyć wyrażenia funkcyjnego:
people.filter(p => p.dinner == "sushi") // => [{ "name": "john", "dinner": "sushi" }]
Możesz wyszukiwać osoby, które
"dinner": "sushi"
używają domenymap
people.map(function (person) { if (person.dinner == "sushi") { return person } else { return null } }); // => [null, { "name": "john", "dinner": "sushi" }, null]
lub a
reduce
people.reduce(function (sushiPeople, person) { if (person.dinner == "sushi") { return sushiPeople.concat(person); } else { return sushiPeople } }, []); // => [{ "name": "john", "dinner": "sushi" }]
Jestem pewien, że możesz to uogólnić na dowolne klucze i wartości!
źródło
grep
metodę jQuery . Może mieć sens zawarcie w Twojej odpowiedzi, ponieważ jest to ta sama koncepcja, co robisz, ale zależna od jQuery i przyjazna przeglądarkom.jQuery ma wbudowaną metodę,
jQuery.grep
która działa podobnie dofilter
funkcji ES5 z odpowiedzi @ adamse i powinna działać dobrze na starszych przeglądarkach.Na przykładzie Adama:
var peoples = [ { "name": "bob", "dinner": "pizza" }, { "name": "john", "dinner": "sushi" }, { "name": "larry", "dinner": "hummus" } ];
możesz wykonać następujące czynności
jQuery.grep(peoples, function (person) { return person.dinner == "sushi" }); // => [{ "name": "john", "dinner": "sushi" }]
źródło
var getKeyByDinner = function(obj, dinner) { var returnKey = -1; $.each(obj, function(key, info) { if (info.dinner == dinner) { returnKey = key; return false; }; }); return returnKey; }
jsFiddle .
O ile
-1
nie jest to nigdy prawidłowy klucz.źródło
Jeśli masz zamiar często przeprowadzać to wyszukiwanie, rozważ zmianę formatu obiektu, aby obiad był kluczowy. Przypomina to przypisywanie podstawowego klucza klastrowego w tabeli bazy danych. Na przykład:
Obj = { 'pizza' : { 'name' : 'bob' }, 'sushi' : { 'name' : 'john' } }
Możesz teraz łatwo uzyskać do niego dostęp w następujący sposób:
Object['sushi']['name']
Lub jeśli obiekt jest naprawdę taki prosty (po prostu „nazwa” w obiekcie), możesz go po prostu zmienić na:
Obj = { 'pizza' : 'bob', 'sushi' : 'john' }
A następnie uzyskać do niego dostęp, takich jak:
Object['sushi']
.Oczywiście nie zawsze jest możliwa lub korzystna zmiana struktury obiektu danych w ten sposób, ale chodzi o to, że czasami najlepszą odpowiedzią jest rozważenie, czy obiekt danych ma najlepszą strukturę. Utworzenie takiego klucza może być szybsze i stworzyć bardziej przejrzysty kod.
źródło
Obiekt można znaleźć w tablicy za pomocą biblioteki Alasql :
var data = [ { name : "bob" , dinner : "pizza" }, { name : "john" , dinner : "sushi" }, { name : "larry", dinner : "hummus" } ]; var res = alasql('SELECT * FROM ? WHERE dinner="sushi"',[data]);
Wypróbuj ten przykład w jsFiddle .
źródło
Możesz użyć prostej pętli 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]); } }
Poniższy przykład skrzypiec umieszcza wszystkie obiekty, które zawierają,
dinner:sushi
w tablicy:https://jsfiddle.net/3asvkLn6/1/
źródło
Jest tu już wiele dobrych odpowiedzi, więc dlaczego nie jeszcze jednej, skorzystaj z biblioteki takiej jak lodash lub podkreślenie :)
obj = { 1 : { name : 'bob' , dinner : 'pizza' }, 2 : { name : 'john' , dinner : 'sushi' }, 3 : { name : 'larry', dinner : 'hummus' } } _.where(obj, {dinner: 'pizza'}) >> [{"name":"bob","dinner":"pizza"}]
źródło
Musiałem przeszukać zagnieżdżoną strukturę mapy witryny dla pierwszego elementu liścia, który obsługuje daną ścieżkę. Wymyśliłem następujący kod, używając tylko
.map()
.filter()
i.reduce
. Zwraca ostatni znaleziony element, który pasuje do ścieżki/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);
źródło
Jeśli chcesz znaleźć określony obiekt za pomocą funkcji wyszukiwania, spróbuj czegoś takiego:
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");
Oto przykładowy obiekt:
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"} }
Kod dokona iteracji i znajdzie tablicę „user” oraz wyszuka obiekt, którego szukasz.
Mój problem polegał na tym, że indeks tablicy zmieniał się przy każdym odświeżaniu okna i znajdował się w trzeciej lub drugiej tablicy, ale to nie ma znaczenia.
Zadziałało dla mnie jak urok!
W Twoim przykładzie jest trochę krótszy:
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');
źródło
Starałbym się nie wymyślać koła na nowo. Używamy skanowania obiektów do wszystkich naszych potrzeb związanych z przetwarzaniem danych. Jest koncepcyjnie bardzo prosty, ale pozwala na wiele fajnych rzeczy. Oto, jak możesz rozwiązać swoje konkretne pytanie
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' }
źródło