如何使用JavaScript过滤复杂的JSON对象?

19

我有以下的 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",
    }]
};

如何筛选这个对象,并保留home_id = 2的HOMES属性?

结果:

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

有没有办法循环对象并保留所有属性(包括lofts和maisons)?

谢谢


home_id 属性是 json.HOMES 数组中所有对象的唯一值吗? - Yosvel Quintero
2个回答

19
你可以使用 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>');


这很有帮助,但我现在的情况是需要根据一个存储在数组中的属性列表进行过滤。更准确地说,如果我想要所有id为[1,2]的房屋,我该如何修改上面的代码?我尝试了return a.home_id = ['1','2'];,但它并没有按照预期工作。 - sc28
2
如果你想使用@sc28,那么你需要使用indexOf进行比较,比如return ['1','2'].indexOf(a.home_id) !== -1; 或者使用includes进行检查,比如return ['1','2'].includes(a.home_id); - Nina Scholz

5
使用实用程序库Lodash,如果home_id是唯一的,您可以使用方法findFind:迭代collection(Array | Object)的元素,返回第一个使predicate返回真值的元素。谓词使用三个参数调用:(value、index | key、collection)。
_.find(collection, [predicate=_.identity])

代码:

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>

如果有多个具有相同home_id的对象,您应该进行筛选_.filter(collection, [predicate=_.identity]) 筛选:迭代collection(数组|对象)的元素,返回所有谓词为真的元素数组。谓词使用三个参数调用:(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>');
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.12.0/lodash.min.js"></script>


你应该使用过滤器而不是查找,因为OP确实指定了一个where子句(因此根据定义可能有多个匹配项)。此外,在lodash和underscore中都有更简单的匹配器:_.where(json.HOMES, {home_id: "2"}(http://underscorejs.org/#findWhere)或`_.filter(json.HOMES, {home_id: "2"}`(https://lodash.com/docs#filter)。 - rewritten

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接