Mam następującą tablicę JavaScript obiektów domowych nieruchomości:
var json = {
'homes': [{
"home_id": "1",
"price": "925",
"sqft": "1100",
"num_of_beds": "2",
"num_of_baths": "2.0",
}, {
"home_id": "2",
"price": "1425",
"sqft": "1900",
"num_of_beds": "4",
"num_of_baths": "2.5",
},
// ... (more homes) ...
]
}
var xmlhttp = eval('(' + json + ')');
homes = xmlhttp.homes;
Chciałbym wykonać filtr na obiekcie, aby zwrócić podzbiór obiektów „domowych”.
Na przykład, chcę być w stanie filtra opiera się na: price
, sqft
, num_of_beds
, inum_of_baths
.
Jak mogę wykonać coś w JavaScript, np. Pseudo-kod poniżej:
var newArray = homes.filter(
price <= 1000 &
sqft >= 500 &
num_of_beds >=2 &
num_of_baths >= 2.5 );
Uwaga: składnia nie musi być dokładnie taka jak powyżej. To tylko przykład.
javascript
JGreig
źródło
źródło
var json = { ... }
JSON to tekstowy zapis do wymiany danych. (Więcej tutaj.) Jeśli masz do czynienia z kodem źródłowym JavaScript, a nie z łańcuchem , nie masz do czynienia z JSON.Odpowiedzi:
Możesz użyć
Array.prototype.filter
metody:Przykład na żywo:
Pokaż fragment kodu
Ta metoda jest częścią nowego standardu ECMAScript 5. edycji i można ją znaleźć w prawie wszystkich nowoczesnych przeglądarkach.
W przypadku przeglądarki IE można dołączyć następującą metodę zgodności:
źródło
Array.prototype.filter.length == 1;
). Gdy użyjesz drugiego argumentu, zostanie on użyty jakothis
wartość wewnątrz funkcji zwrotnej.Możesz spróbować użyć frameworka takiego jak jLinq - poniżej znajduje się przykładowy kod użycia jLinq
Aby uzyskać więcej informacji, kliknij link http://www.hugoware.net/projects/jlinq
źródło
Wolę szkielet Underscore. Sugeruje wiele przydatnych operacji na obiektach. Twoje zadanie:
może być przytłoczony jak:
Mam nadzieję, że ci się przyda!
źródło
underscore-query
( github.com/davidgtonge/underscore-query ), który używa składni podobnej do MongoDB do zapytania o tablice javascript. Więc skorzystaj_.query(homes, {price: {$lt:1000}, sqft: {$gte: 500}, num_of_beds: {$gte:2}, num_of_baths: {$gte: 2.5}}
Dziwię się, że nikt nie opublikował odpowiedzi w jednym wierszu:
... i żebyś mógł łatwiej to przeczytać:
źródło
oto działające skrzypce, które działa dobrze w IE8 przy użyciu funkcji MAP Jquery
http://jsfiddle.net/533135/Cj4j7/
źródło
Możesz używać jQuery.grep () od jQuery 1.0:
źródło
Można to zrobić dość łatwo - prawdopodobnie istnieje wiele implementacji do wyboru, ale to mój podstawowy pomysł (i prawdopodobnie istnieje pewien format, w którym można iterować obiekt za pomocą jQuery, nie mogę teraz o tym pomyśleć):
Następnie możesz wywołać tę funkcję w następujący sposób:
W ten sposób możesz wywołać filtr na podstawie dowolnego predykatu, który zdefiniujesz, a nawet filtrować wiele razy, używając mniejszych filtrów.
źródło
Możesz samodzielnie wdrożyć metodę filtrowania, która spełnia Twoje potrzeby, oto jak:
Mam nadzieję, że to pomoże!
źródło
Powinieneś sprawdzić OGX.List, który ma wbudowane metody filtrowania i rozszerza standardową tablicę javascript (a także grupowanie, sortowanie i wyszukiwanie). Oto lista operatorów obsługiwanych przez filtry:
Możesz użyć tego w ten sposób
Lub nawet w ten sposób
Lub jako jedna wkładka
źródło
Możesz też po prostu użyć
$.each
(który działa również dla obiektów, nie tylko tablic) i zbudować nową tablicę:źródło
Używam mojej
ruleOut
funkcji do filtrowania obiektów na podstawie określonych niepożądanych wartości właściwości. Rozumiem, że w twoim przykładzie chciałbyś użyć warunków zamiast wartości, ale moja odpowiedź jest ważna dla tytułu pytania, więc chciałbym zostawić tutaj swoją metodę.Załóżmy, że masz listę takich aktorów:
i chcielibyście znaleźć wszystkich aktorów, którzy zostali sklasyfikowani jako gwiazdy Holywood, ich narodowość nie powinna należeć do „angielskiej”, „włoskiej”, „hiszpańskiej”, „greckiej”, a ich imiona nie będą należeć do „Mary”, „Joe”. Przykład Bizzara, wiem! W każdym razie przy takim zestawie warunków utworzyłbyś następujący obiekt:
OK, teraz jeśli tylko
ruleOut(actors, unwantedFieldsFilter)
byś to dostałA Bill jest twoim mężczyzną, ponieważ nie ma na imię „Mary”, „Joe”, jego narodowość nie jest uwzględniona w [„angielskim”, „włoskim”, „hiszpańskim”, „greckim”], a ponadto jest gwiazdą!
W mojej metodzie jest jedna opcja, która jest
applyAllFilters
i jest domyślnie prawdziwa. Jeśli spróbujesz ustawić regułę z tym parametrem ustawionym na false, zadziała to jak filtrowanie „LUB” zamiast „I”. Przykład:ruleOut(actors, {job:["actor"], language:["Italian"]}, false)
sprawiłby, że każdy, kto nie jest aktorem ani Włochem:źródło
Możesz użyć tej funkcji lambda. Więcej szczegółów można znaleźć tutaj, ponieważ filtrujemy dane w oparciu o twoje warunki, które zwracają wartość prawda lub fałsz, a dane będą gromadzone w innej tablicy, więc twoja rzeczywista tablica nie zostanie zmodyfikowana.
@JGreig Proszę spojrzeć na to.
źródło
źródło
źródło