简体   繁体   English

json/js/jquery 如何过滤嵌套json数组中的多个对象

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM