фильтровать массив из вложенного массива в JavaScript - PullRequest
0 голосов
/ 24 июня 2019

У меня есть два массива, мне нужно отфильтровать это по имени.

const arr1 = ["Saab", "Volvo", "BMW", "Car3", "Car2", "Van", "Bus"];
const arr2 = [
    {
        name: "Saab",
        url: "saab/"
    },
    {
        name: "Volvo",
        url: "volvo/",
        children:[
            {
                name: "Van",
                url: "van/"
            },
            {
                name: "Bus",
                url: "bus/"
            },
        ]
    },
    {
        name: "BMW",
        url: "bmw/"
    },
    {
        name: "SUV",
        url: "suv/",
        children:[
            {
                name: "Car1",
                url: "car1/"
            },
            {
                name: "Car2",
                url: "car2/"
            },
            {
                name: "Car3",
                url: "car3/"
            },
        ]
    }
]

Я пытался с этим кодом. const result = arr2.filter((item) => arr1.includes(item.name);

Этот код работает нормально, но он не проверяет дочерний объект в arr2, мне нужно проверить, основываясь на значениях arr1, и если у меня есть дочерний объект, мне нужно также проверить это имя. Например: имя SUV в arr1, но значения car1 и car2 не в arr1, тогда мне нужно удалить этот SUV объект.

Мой вывод должен быть:

[
    {
        name: "Saab",
        url: "saab/"
    },
    {
        name: "Volvo",
        url: "volvo/",
        children:[
            {
                name: "Van",
                url: "van/"
            },
            {
                name: "Bus",
                url: "bus/"
            },
        ]
    },
    {
        name: "BMW",
        url: "bmw/"
    },
]

Как я могу сделать это, используя javascript, это можно сделать в es6?

Ответы [ 3 ]

2 голосов
/ 24 июня 2019

Вы можете использовать другую функцию фильтра, чтобы проверить children внутри функции фильтра для этого.

Объяснение:

  • проверка item и item.length, чтобы убедиться, что детисуществует и не является пустым (вы можете удалить второй, если в этом нет необходимости, но он безопаснее, поскольку в большинстве случаев он гарантирует, что потомки являются массивом и что .every не выдаст ошибку)
  • .every и.includes проверка, все ли дети находятся в arr1
  • для второй части альтернативы с ||, она не выполняется, если первая часть истинна
  • во второй части, выприходится проверять !item.children, потому что если первая альтернатива не удастся выполнить для детей, она будет иметь откат к результату arr1.includes(item.name), а "SUV" вернется к результату

const arr1 = ["Saab", "Volvo", "BMW", "SUV", "Car3", "Van", "Bus"];
const arr2 = [
    {
        name: "Saab",
        url: "saab/"
    },
    {
        name: "Volvo",
        url: "volvo/",
        children:[
            {
                name: "Van",
                url: "van/"
            },
            {
                name: "Bus",
                url: "bus/"
            },
        ]
    },
    {
        name: "BMW",
        url: "bmw/"
    },
    {
        name: "SUV",
        url: "suv/",
        children:[
            {
                name: "Car1",
                url: "car1/"
            },
            {
                name: "Car2",
                url: "car2/"
            },
            {
                name: "Car3",
                url: "car3/"
            },
        ]
    }
];

const result = arr2.filter( (item) => ( (item.children && item.children.length && item.children.every(v => arr1.includes(v.name))) || (!item.children && arr1.includes(item.name)) ) );

console.log(result);

РЕДАКТИРОВАТЬ : исправлен код, соответствующий требованиям

EDIT2 : превращен в чистый ответ ES6, старыйвылеплено не нужно сейчас

0 голосов
/ 24 июня 2019

Пожалуйста, попробуйте это.

res = arr2.filter(item2 => (arr1.findIndex(item1 => item2['name'] == item1) > -1))
0 голосов
/ 24 июня 2019

вы можете использовать foreach для результата и проверять значение элементов последним методом (отфильтровать вложенный массив).

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