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

Posted

技术标签:

【中文标题】如何使用 javascript 过滤复杂的 json 对象?【英文标题】:How to Filter a complex json object using javascript? 【发布时间】:2016-09-11 11:48:02 【问题描述】:

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

有什么方法可以循环对象并管理所有属性(还有阁楼和房屋)?

谢谢

【问题讨论】:

属性home_idjson.HOMES数组的所有对象的唯一值吗? 【参考方案1】:

您可以使用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,那么您需要使用indexOf 进行比较,例如return ['1','2'].indexOf(a.home_id) !== -1; 或使用includes,例如return ['1','2'].includes(a.home_id);【参考方案2】:

使用实用程序库Lodash,如果home_id 是唯一的,则可以使用方法find。

查找:遍历collection (Array|Object) 的元素,返回第一个元素predicate 返回truthy for。谓词使用三个参数调用:(值、索引|键、集合)。

_.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>');
&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.12.0/lodash.min.js"&gt;&lt;/script&gt;

如果有多个对象具有相同的home_id,您应该创建一个filter:

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

Filter:遍历collection (Array|Object) 的元素,返回一个包含所有元素的数组,谓词返回truthy for。谓词使用三个参数调用:(值、索引|键、集合)。

代码:

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>');
&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.12.0/lodash.min.js"&gt;&lt;/script&gt;

【讨论】:

您实际上应该使用过滤器,而不是查找,因为 OP 确实指定了 where 子句(因此根据定义,可能会有多个匹配项)。此外,还有更简单的匹配器,包括 lodash 和下划线:_.where(json.HOMES, home_id: "2" (underscorejs.org/#findWhere) 或 _.filter(json.HOMES, home_id: "2" (lodash.com/docs#filter)。

以上是关于如何使用 javascript 过滤复杂的 json 对象?的主要内容,如果未能解决你的问题,请参考以下文章

javascript的JSON对象

在javascript中循环遍历python-dictionary-turned-into-json

如何使用简单的 javascript 过滤 html 表格?

如何解析json中map数据

Javascript:如何组合和过滤数组

如何使用 JavaScript 过滤 xml 文件