2016-05-15 27 views
17

Ho il seguente oggetto JSON:Come filtrare un oggetto JSON complesso usando 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", 
    }] 
}; 

Come posso filtrare questo oggetto e rimanere con la proprietà case dove home_id = 2?

Risultato:

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

Esiste un modo che posso ciclo l'oggetto e mantiene tutto il suo proprietà (anche loft e maisons)?

Grazie

+0

è la proprietà 'home_id' un valore unico per tutti gli oggetti dell'array' json.HOMES'? –

risposta

15

È possibile utilizzare Array#filter e assegnare il risultato direttamente alla struttura HOMES.

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

Questo è stato utile, tuttavia sono in una situazione in cui devo filtrare in base a un elenco di attributi, memorizzati in un array? Più precisamente, come modifico il precedente se volessi tutte le case con ID [1,2]? Ho provato 'return a.home_id = ['1', '2'];' ma non funziona come previsto. – sc28

+1

@ sc28, quindi è necessario utilizzare 'indexOf' con un confronto, come' return ['1', '2']. IndexOf (a.home_id)! == -1; 'o per verificare con' includes' , come 'return ['1', '2']. include (a.home_id);'. –

5

Con l'uso della libreria di utilità Lodash, è possibile utilizzare il metodo find se home_id è unico.

Trova: Itera su elementi di collection (Array | Object), restituendo il primo elemento predicate rendimenti truthy per. Il predicato è invocato con tre argomenti: (valore, indice | chiave, raccolta).

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

Codice:

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>

Se ci sono più oggetti con lo stesso home_id si dovrebbe fare un filter:

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

Filtro: Itera su elementi di collection (matrice | Oggetto), restituendo un array di tutti gli elementi per cui il predicato restituisce la verità. Il predicato è invocato con tre argomenti: (valore, indice | chiave, raccolta).

Codice:

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

In realtà dovresti usare un filtro, non una ricerca, perché l'OP ha specificato una clausola 'where' (quindi per definizione potrebbero esserci più di una corrispondenza). Inoltre, ci sono abbinamenti molto più semplici, sia in lodash che in underscore: '_.where (json.HOMES, {home_id:" 2 "}' (http://underscorejs.org/#findWhere) o '_.filter (json.HOMES, {home_id: "2"} '(https://lodash.com/docs#filter). – rewritten