如何使用javascript过滤复杂的json对象?

Cod*_*alo 18 javascript jquery json filter

我有以下json对象:

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",
    }]
};
Run Code Online (Sandbox Code Playgroud)

如何过滤此对象并保留在home_id = 2的HOMES属性中?

结果:

var json = {
    "Lofts": "none",
    "Maisons": "2",
    "HOMES": [{
        "home_id": "2",
        "price": "1425",
        "num_of_beds": "4",
    }]
};
Run Code Online (Sandbox Code Playgroud)

有什么方法可以循环对象和mantein所有的属性(也是阁楼和maisons)?

谢谢

Nin*_*olz 17

您可以使用Array#filter结果并将结果直接分配给属性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>');
Run Code Online (Sandbox Code Playgroud)

  • @ sc28,那么您需要使用带有比较的`indexOf`,例如`return ['1','2']。indexOf(a.home_id)!== -1;`或使用`includes'进行检查,如`return ['1','2']。includes(a.home_id);`。 (2认同)

Yos*_*ero 5

使用实用程序库Lodash,您可以使用find if 方法home_id是唯一的.

查找:迭代collection(Array | Object)的元素,返回第一个元素predicate返回truthy for.使用三个参数调用谓词:(value,index | key,collection).

_.find(collection, [predicate=_.identity])
Run Code Online (Sandbox Code Playgroud)

码:

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>');
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.12.0/lodash.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

如果有多个具有相同对象的对象,home_id则应进行过滤:

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

过滤:迭代collection(Array | Object)的元素,返回所有元素的数组谓词返回truthy.使用三个参数调用谓词:(value,index | key,collection).

码:

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>');
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.12.0/lodash.min.js"></script>
Run Code Online (Sandbox Code Playgroud)