2016-05-15 6 views
17

Ich habe folgendes json Objekt:Wie filtert man ein komplexes Json-Objekt mit Javascript?

var json = { 
    "Lofts": "none", 
    "Maisons": "2", 
    "HOMES": [{ 
     "home_id": "1", 
     "price": "925", 
     "num_of_beds": "2" 
    }, { 
     "home_id": "2", 
     "price": "1425", 
     "num_of_beds": "4", 
    }, { 
     "home_id": "3", 
     "price": "333", 
     "num_of_beds": "5", 
    }] 
}; 

Wie kann ich dieses Objekt auswählen, und mit dem HAUSE Eigentum bleiben, wo home_id = 2?

Ergebnis:

var json = { 
    "Lofts": "none", 
    "Maisons": "2", 
    "HOMES": [{ 
     "home_id": "2", 
     "price": "1425", 
     "num_of_beds": "4", 
    }] 
}; 

Gibt es eine Möglichkeit, Zyklus kann das Objekt und die Umgebung zu der alle Eigenschaften (auch Lofts und maisons)?

Dank

+0

Ist die Eigenschaft 'home_id' einen eindeutigen Wert für alle Objekte des' json.HOMES' Array? –

Antwort

15

können Sie Array#filter verwenden und das Ergebnis direkt auf die Eigenschaft HOMES zuweisen.

var json = { "Lofts": "none", "Maisons": "2", "HOMES": [{ "home_id": "1", "price": "925", "num_of_beds": "2" }, { "home_id": "2", "price": "1425", "num_of_beds": "4", }, { "home_id": "3", "price": "333", "num_of_beds": "5", }] }; 
 

 
json.HOMES = json.HOMES.filter(function (a) { 
 
    return a.home_id === '2'; 
 
}); 
 

 
document.write('<pre>' + JSON.stringify(json, 0, 4) + '</pre>');

+0

Das war hilfreich, aber ich bin in einer Situation, in der ich nach einer Liste von Attributen filtern muss, die in einem Array gespeichert sind? Genauer gesagt, wie würde ich das obige ändern, wenn ich alle Häuser mit IDs [1,2] haben wollte? Ich habe 'return a.home_id = ['1', '2'];' versucht, aber es funktioniert nicht wie erwartet. – sc28

+1

@ sc28, dann müssen Sie entweder 'indexOf' mit einem Vergleich verwenden, wie 'return ['1', '2']. IndexOf (a.home_id)! == -1;' oder mit 'includes' zu überprüfen , wie 'return ['1', '2']. includes (a.home_id);'. –

5

Mit dem Einsatz von Utility-Bibliothek Lodash, können Sie die Methode find wenn home_id ist einzigartig verwenden.

Finden: Durchläuft Elemente collection (Array | Object), das erste Element predicate kehrt truthy für die Rückkehr. Das Prädikat wird mit drei Argumenten aufgerufen: (value, index | key, collection).

_.find(collection, [predicate=_.identity]) 

Code:

var json = {"Lofts": "none","Maisons": "2","HOMES": [{"home_id": "1","price": "925","num_of_beds": "2"}, {"home_id": "2","price": "1425","num_of_beds": "4"}, {"home_id": "3","price": "333","num_of_beds": "5"}]}; 
 
json.HOMES = [_.find(json.HOMES, {home_id: '2'})]; 
 

 
document.write('<pre>' + JSON.stringify(json, 0, 4) + '</pre>');
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.12.0/lodash.min.js"></script>

Wenn mehrere Objekte mit demselben home_id sind, sollten Sie eine filter machen:

_.filter(collection, [predicate=_.identity])

Filter: Iteriert Elemente von collection (Array | Object) und gibt ein Array aller Elemente zurück, für die das Prädikat truthy zurückgibt. Das Prädikat wird mit drei Argumenten aufgerufen: (value, index | key, collection).

Code:

var json = {"Lofts": "none","Maisons": "2","HOMES": [{"home_id": "1","price": "925","num_of_beds": "2"}, {"home_id": "2","price": "1425","num_of_beds": "4"}, {"home_id": "3","price": "333","num_of_beds": "5"}]}; 
 
json.HOMES = _.filter(json.HOMES, {home_id: '2'}); 
 

 
document.write('<pre>' + JSON.stringify(json, 0, 4) + '</pre>');
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.12.0/lodash.min.js"></script>

+0

Sie sollten eigentlich einen Filter verwenden, keinen Fund, weil das OP eine 'where'-Klausel spezifiziert hat (es kann also per Definition mehr als eine Übereinstimmung geben). Außerdem gibt es viel einfachere Matcher, sowohl in lodash als auch in Unterstrichen: '_.where (json.HOMES, {home_id:" 2 "}' (http://underscorejs.org/#findWhere) oder '_.filter (json.HOMES, {home_id: "2"} '(https://lodash.com/docs#filter). – rewritten

Verwandte Themen