Ich habe das folgende JavaScript-Array von Immobilien-Home-Objekten:
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;
Ich möchte in der Lage sein, einen Filter für das Objekt auszuführen, um eine Teilmenge von "Home" -Objekten zurückzugeben.
Zum Beispiel möchte ich Filter in der Lage sein , basierend auf: price
, sqft
, num_of_beds
, und num_of_baths
.
Wie kann ich in JavaScript etwas wie den folgenden Pseudocode ausführen:
var newArray = homes.filter(
price <= 1000 &
sqft >= 500 &
num_of_beds >=2 &
num_of_baths >= 2.5 );
Beachten Sie, dass die Syntax nicht genau wie oben sein muss. Dies ist nur ein Beispiel.
javascript
JGreig
quelle
quelle
var json = { ... }
JSON ist eine Textnotation für den Datenaustausch. (Mehr hier.) Wenn Sie mit JavaScript-Quellcode und nicht mit einer Zeichenfolge arbeiten , haben Sie es nicht mit JSON zu tun.Antworten:
Sie können die
Array.prototype.filter
Methode verwenden:Live-Beispiel:
Code-Snippet anzeigen
Diese Methode ist Teil des neuen ECMAScript 5th Edition- Standards und kann in fast allen modernen Browsern verwendet werden.
Für IE können Sie aus Kompatibilitätsgründen die folgende Methode einschließen:
quelle
Array.prototype.filter.length == 1;
). Wenn Sie das zweite Argument verwenden, wird es alsthis
Wert in der Rückruffunktion verwendet.Sie können versuchen, ein Framework wie jLinq zu verwenden. Im Folgenden finden Sie ein Codebeispiel für die Verwendung von jLinq
Weitere Informationen finden Sie unter dem Link http://www.hugoware.net/projects/jlinq
quelle
Ich bevorzuge das Underscore-Framework. Es werden viele nützliche Operationen mit Objekten vorgeschlagen. Deine Aufgabe:
kann wie folgt überschrieben werden:
Hoffe, es wird nützlich für Sie sein!
quelle
underscore-query
( github.com/davidgtonge/underscore-query ), das MongoDB-ähnliche Syntax verwendet, um Javascript-Arrays abzufragen. Also hier würden Sie verwenden_.query(homes, {price: {$lt:1000}, sqft: {$gte: 500}, num_of_beds: {$gte:2}, num_of_baths: {$gte: 2.5}}
Ich bin überrascht, dass niemand die einzeilige Antwort gepostet hat:
... und damit Sie es leichter lesen können:
quelle
Hier ist die funktionierende Geige, die in IE8 mit der Funktion jquery MAP einwandfrei funktioniert
http://jsfiddle.net/533135/Cj4j7/
quelle
Sie können jQuery.grep () seit jQuery 1.0 verwenden:
quelle
Sie könnten dies ziemlich einfach tun - es gibt wahrscheinlich viele Implementierungen, aus denen Sie auswählen können, aber dies ist meine Grundidee (und es gibt wahrscheinlich ein Format, in dem Sie mit jQuery über ein Objekt iterieren können, ich kann es mir gerade nicht vorstellen):
Und dann können Sie diese Funktion folgendermaßen aufrufen:
Auf diese Weise können Sie den Filter basierend auf dem von Ihnen definierten Prädikat aufrufen oder sogar mehrmals mit kleineren Filtern filtern.
quelle
Sie können selbst eine Filtermethode implementieren, die Ihren Anforderungen entspricht. So geht's:
Ich hoffe es hilft!
quelle
Sie sollten sich OGX.List ansehen, das Filtermethoden integriert und das Standard-Javascript-Array erweitert (sowie Gruppieren, Sortieren und Suchen). Hier ist eine Liste der Operatoren, die für die Filter unterstützt werden:
Sie können es auf diese Weise verwenden
Oder auch so
Oder als Einzeiler
quelle
Oder Sie können einfach verwenden
$.each
(was auch für Objekte funktioniert, nicht nur für Arrays) und ein neues Array wie folgt erstellen:quelle
Ich verwende meine
ruleOut
Funktion zum Filtern von Objekten basierend auf bestimmten unerwünschten Eigenschaftswerten. Ich verstehe, dass Sie in Ihrem Beispiel Bedingungen anstelle von Werten verwenden möchten, aber meine Antwort gilt für den Fragentitel. Daher möchte ich meine Methode hier belassen.Angenommen, Sie haben eine Liste solcher Schauspieler:
und Sie möchten alle Schauspieler finden, die als Holywood-Stars eingestuft sind. Ihre Nationalität sollte nicht "Englisch", "Italienisch", "Spanisch", "Griechisch" sein, und ihr Name sollte nicht "Mary" sein. "Joe". Bizzar Beispiel, ich weiß! Mit diesen Bedingungen würden Sie auf jeden Fall das folgende Objekt erstellen:
OK, jetzt, wenn Sie
ruleOut(actors, unwantedFieldsFilter)
nur bekommen würdenUnd Bill ist dein Mann, da sein Name nicht "Mary", "Joe" ist, seine Nationalität nicht in ["Englisch", "Italienisch", "Spanisch", "Griechisch" enthalten ist und er ein Star ist!
In meiner Methode gibt es eine Option, die
applyAllFilters
standardmäßig wahr ist. Wenn Sie versuchen würden, ruleOut mit diesem Parametersatz als false festzulegen, funktioniert dies als ODER-Filterung anstelle von UND. Beispiel:ruleOut(actors, {job:["actor"], language:["Italian"]}, false)
Würde Ihnen jeder bringen, der kein Schauspieler oder Italiener ist:quelle
Sie können diese Lambda-Funktion verwenden. Weitere Details finden Sie hier, da wir die Daten basierend auf Ihrer Bedingung filtern, die true oder false zurückgibt, und die Daten in verschiedenen Arrays sammeln, sodass Ihr tatsächliches Array nicht geändert wird.
@JGreig Bitte schauen Sie hinein.
quelle
quelle
quelle