json / js / jquery как отфильтровать несколько объектов во вложенном массиве json - PullRequest
1 голос
/ 12 марта 2020

Я столкнулся с небольшой проблемой фильтрации данных во вложенном динамическом массиве json. Может кто-нибудь, пожалуйста, помогите мне решить мою проблему ..

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"
                }]
            }
        ]
    }
}

Выше json объекты могут динамически увеличиваться. Теперь я пытаюсь отфильтровать JSON, передав несколько объектов (name,startTime,endTime). Ниже приведен код, который я пытаюсь ..

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;
                            });
                        });
                    });

Над кодом будет работать, если я передам только name. Потому что я фильтрую только до children. Как я могу отфильтровать свойства, доступные в order?

Для вышеупомянутого JSON мне нужно передать name,startTime, endTime. И ожидаемый результат должен выглядеть следующим образом ..

data = {
    "root": {
        "children": [{
                "name": "Concept Phase",
                "order": [{
                    "startTime": "20150101000000",
                    "endTime": "20150125000000"
                }]
            }
 ]
    }
}

Может кто-нибудь помочь мне решить проблему?

Заранее спасибо ..

Ответы [ 2 ]

0 голосов
/ 12 марта 2020

Вы используете .every () и .some () неправильно, я бы посоветовал вам прочитать больше о них, чтобы понять, как они используются. Таким образом, проблема с вызовом функции .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);
0 голосов
/ 12 марта 2020

Вы можете установить точный объект в переменной filterBy, как показано ниже

var filterBy = {
                         name: "Concept Phase",
                         order:[{
                    "startTime": "20150101000000",
                    "endTime": "20150125000000"
                }]
                    };

, а затем использовать приведенный ниже код для фильтрации объектов из массива потомков

var result = data.root.children.filter(function (o) {
                        return JSON.stringify(o) === JSON.stringify(filterBy)
                    });

Вы также используете функции подчеркивания js _.isEqual для сравнения объектов, что полезно, если порядок пар ключ-значение отличается в исходном объекте

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...