如何使用 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_id
是json.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>');
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.12.0/lodash.min.js"></script>
如果有多个对象具有相同的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>');
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.12.0/lodash.min.js"></script>
【讨论】:
您实际上应该使用过滤器,而不是查找,因为 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中循环遍历python-dictionary-turned-into-json