简体   繁体   中英

How to Filter a complex json object using javascript?

I have the following json object :

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",
    }]
};

How can I filter this object and remain with the HOMES property where home_id = 2 ?

Result:

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

Is there any way I can cycle the object and mantein all the properties( also lofts and maisons)?

Thanks

You can use Array#filter and assign the result directly to the property 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>'); 

With the use of utility library Lodash , you can use the method find if home_id is unique.

Find : Iterates over elements of collection (Array|Object), returning the first element predicate returns truthy for. The predicate is invoked with three arguments: (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> 

If there are multiple objects with the same home_id you should make a filter :

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

Filter : Iterates over elements of collection (Array|Object), returning an array of all elements predicate returns truthy for. The predicate is invoked with three arguments: (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> 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM