[英]json/js/jquery how to filter multiple objects in nested json array
im facing a small issue in filtering the data in dynamice nested json array.我在过滤动态嵌套 json 数组中的数据时面临一个小问题。 Can someone please help me to resolve my issue..
有人可以帮我解决我的问题..
var data = {
"root": {
"children": [{
"name": "Concept Phase",
"order": [{
"startTime": "20150101000000",
"endTime": "20150125000000"
}]
},
{
"name": "Design Phase",
"order": [{
"startTime": "2015012500000",
"endTime": "20150311000000"
}]
},
{
"name": "Validation Phase",
"order": [{
"startTime": "2015031100000",
"endTime": "20150430000000"
}]
},
{
"name": "Production Preparation",
"order": [{
"startTime": "2015043000000",
"endTime": "20150612000000"
}]
}
]
}
}
Above json objects may increase dynamically.以上json对象可能会动态增加。 Now im trying to filter the JSON by passing multiple objects(
name,startTime,endTime
).现在我试图通过传递多个对象(
name,startTime,endTime
)来过滤 JSON。 Below is the code im trying..下面是我正在尝试的代码..
var filterBy = {
name: ["Concept Phase"],
startTime:["20150101000000"],
endTime: ["20150125000000"]
};
var result = data.root.children.filter(function (o) {
return Object.keys(filterBy).every(function (k) {
return filterBy[k].some(function (f) {
return o[k] === f;
});
});
});
Above code will work if i pass only name
.如果我只传递
name
上面的代码将起作用。 Because im filtering only upto children
.因为我只过滤
children
。 How can i filter the properties that are available in order
?如何按
order
过滤可用的属性?
For the Above JSON i need to pass name,startTime, endTime
.对于上述 JSON,我需要传递
name,startTime, endTime
。 And the expected output should look like below..预期输出应如下所示..
data = {
"root": {
"children": [{
"name": "Concept Phase",
"order": [{
"startTime": "20150101000000",
"endTime": "20150125000000"
}]
}
]
}
}
Can someone please help me to resolve the issue?有人可以帮我解决这个问题吗?
Thank you in advance..先感谢您..
You can set exact object in filterBy variable as below您可以在 filterBy 变量中设置确切的对象,如下所示
var filterBy = {
name: "Concept Phase",
order:[{
"startTime": "20150101000000",
"endTime": "20150125000000"
}]
};
and then use below code to filter objects from children array然后使用下面的代码从子数组中过滤对象
var result = data.root.children.filter(function (o) {
return JSON.stringify(o) === JSON.stringify(filterBy)
});
You also use underscore js functions _.isEqual to compare objects which is useful if order of key value pairs is different in original object您还可以使用下划线 js 函数 _.isEqual 来比较对象,如果原始对象中键值对的顺序不同,这将很有用
You are using .every() and .some() in the wrong way, I would suggest you read more about them to understand how they are used.您以错误的方式使用.every()和.some() ,我建议您阅读更多关于它们的信息以了解它们的使用方式。 So the issue with your .every() function call is it return a function call instead of returning TRUE/FALSE value that's why its just in its just take the first element of
filterBy
object key array, to achieve what you want I would do it like:所以你的.every()函数调用的问题是它返回一个函数调用而不是返回 TRUE/FALSE 值,这就是为什么它只是取
filterBy
对象键数组的第一个元素,来实现你想要的我会做喜欢:
var data = { "root": { "children": [{ "name": "Concept Phase", "order": [{ "startTime": "20150101000000", "endTime": "20150125000000" }] }, { "name": "Design Phase", "order": [{ "startTime": "2015012500000", "endTime": "20150311000000" }] }, { "name": "Validation Phase", "order": [{ "startTime": "2015031100000", "endTime": "20150430000000" }] }, { "name": "Production Preparation", "order": [{ "startTime": "2015043000000", "endTime": "20150612000000" }] } ] } } var filterBy = { name: ["Concept Phase"], startTime:["20150101000000"], endTime: ["20150125000000"] }; var result = data.root.children.filter(function (o) { return o.name === filterBy.name[0] && o.order[0].startTime === filterBy.startTime[0] && o.order[0].endTime === filterBy.endTime[0]; }); console.log(result);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.