如何使用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)?

感谢

+0

是属性'home_id'为'json.HOMES'阵列的所有对象的唯一值? –

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

+0

这很有帮助,但是我处于需要根据存储在数组中的属性列表进行过滤的情况?更确切地说,如果我想要所有ID为[1,2]的家庭,我将如何修改上述内容?我试过'返回a.home_id = ['1','2'];'但它不能按预期工作。 – sc28

+1

@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>

+0

你实际上应该使用一个过滤器,而不是一个查找,因为OP确实指定了一个'where'子句(所以根据定义可能有多个匹配)。此外,还有更简单的匹配器,无论是lodash还是下划线:'_.where(json.HOMES,{home_id:“2”}'(http://underscorejs.org/#findWhere)或'_。过滤器(json.HOMES,{home_id:“2”}(https://lodash.com/docs#filter)。 – rewritten