如何使用JavaScript过滤复杂的json对象?
我有以下的JSON对象:如何使用JavaScript过滤复杂的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?
结果:
var json = {
"Lofts": "none",
"Maisons": "2",
"HOMES": [{
"home_id": "2",
"price": "1425",
"num_of_beds": "4",
}]
};
有没有什么办法可以循环对象和mantein所有属性(也阁楼和MAISONS)?
感谢
您可以使用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]的家庭,我将如何修改上述内容?我试过'返回a.home_id = ['1','2'];'但它不能按预期工作。 – sc28
@sc28,那么你需要使用'indexOf'进行比较,比如'return ['1','2']。indexOf(a.home_id)!== -1;'或者检查'includes' ,如'return ['1','2']。includes(a.home_id);'。 –
通过使用工具库Lodash,你可以使用的方法find如果home_id
是独一无二的。
查找:迭代过的collection
(阵列|对象)元素,它返回第一元件predicate
返回truthy对。谓词用三个参数调用:(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:
_.filter(collection, [predicate=_.identity])
Filter:遍历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>');
<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”}'(http://underscorejs.org/#findWhere)或'_。过滤器(json.HOMES,{home_id:“2”}(https://lodash.com/docs#filter)。 – rewritten
是属性'home_id'为'json.HOMES'阵列的所有对象的唯一值? –