javascript中嵌套数组的筛选数组

javascript中嵌套数组的筛选数组,javascript,multidimensional-array,Javascript,Multidimensional Array,我有两个数组,需要根据名称对其进行筛选。 const arr1 = ["Saab", "Volvo", "BMW", "Car3", "Car2", "Van", "Bus"]; const arr2 = [ { name: "Saab", url: "saab/" }, { name: "Volvo", url: "volvo/", children:[ {

我有两个数组,需要根据名称对其进行筛选。

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((项目)=>arr1.includes(项目名称);

此代码工作正常,但它不检查
arr2
中的子对象,我需要根据
arr1
值进行检查,如果我有子对象,我也需要检查该名称。例如:name
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
中执行此操作?

您可以使用另一个筛选函数检查筛选函数中的
子项

说明:

  • 检查
    item
    item.length
    以确保子项存在且不为空(如果没有必要,可以删除第二个,但这样更安全,因为在大多数情况下,它可以确保子项是一个数组,并且
    。每个
    都不会抛出错误)
  • 。每个
    都包括
    测试是否所有子项都在
    arr1
  • 对于带有
    | |
    的备选方案的第二部分,如果第一部分为true,则不执行该选项
  • 在第二部分中,您必须测试
    !item.children
    ,因为如果第一个备选方案在子项上失败,它将回退到
    arr1.includes(item.name)
    的结果,并且“SUV”将返回到结果中
const arr1=[“萨博”、“沃尔沃”、“宝马”、“SUV”、“Car3”、“面包车”、“客车”];
常数arr2=[
{
名称:“萨博”,
url:“萨博/”
},
{
名称:“沃尔沃”,
url:“沃尔沃/”,
儿童:[
{
名称:“货车”,
网址:“van/”
},
{
名称:“巴士”,
url:“总线/”
},
]
},
{
名称:“宝马”,
网址:“bmw/”
},
{
名称:“SUV”,
网址:“suv/”,
儿童:[
{
名称:“Car1”,
url:“car1/”
},
{
名称:“Car2”,
url:“car2/”
},
{
名称:“Car3”,
网址:“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);
您可以使用另一个筛选函数来检查筛选函数中的子项

说明:

  • 检查
    item
    item.length
    以确保子项存在且不为空(如果没有必要,可以删除第二个,但这样更安全,因为在大多数情况下,它可以确保子项是一个数组,并且
    。每个
    都不会抛出错误)
  • 。每个
    都包括
    测试是否所有子项都在
    arr1
  • 对于带有
    | |
    的备选方案的第二部分,如果第一部分为true,则不执行该选项
  • 在第二部分中,您必须测试
    !item.children
    ,因为如果第一个备选方案在子项上失败,它将回退到
    arr1.includes(item.name)
    的结果,并且“SUV”将返回到结果中
const arr1=[“萨博”、“沃尔沃”、“宝马”、“SUV”、“Car3”、“面包车”、“客车”];
常数arr2=[
{
名称:“萨博”,
url:“萨博/”
},
{
名称:“沃尔沃”,
url:“沃尔沃/”,
儿童:[
{
名称:“货车”,
网址:“van/”
},
{
名称:“巴士”,
url:“总线/”
},
]
},
{
名称:“宝马”,
网址:“bmw/”
},
{
名称:“SUV”,
网址:“suv/”,
儿童:[
{
名称:“Car1”,
url:“car1/”
},
{
名称:“Car2”,
url:“car2/”
},
{
名称:“Car3”,
网址:“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(结果);
您可以在结果上使用foreach并按最后一种方法检查项目值(筛选嵌套数组)。

您可以在结果上使用foreach并按最后一种方法检查项目值(筛选嵌套数组)。

请尝试此操作

res = arr2.filter(item2 => (arr1.findIndex(item1 => item2['name'] == item1) > -1))
请试试这个

res = arr2.filter(item2 => (arr1.findIndex(item1 => item2['name'] == item1) > -1))

谢谢你的帖子,我不需要返回“SUV”对象。是的,请给我时间编辑,我误解了你的要求(解释有点不准确)@techie18编辑了答案。如果没有找到孩子,我通常会使用常规的
for
循环通过退出循环进行优化,但设置
I=l
来结束for循环听起来有点奇怪。相反,你为什么不使用
break
?我想这是一个个人习惯,如果有额外的代码,我从不喜欢
break
关键字对于
声明的第二部分,我希望它能被执行谢谢你的帖子我自己不需要返回“SUV”对象是的给我时间编辑,我误解了你的要求(解释有点不准确)@techie18编辑了答案。如果没有找到孩子,我通常会使用常规的
for
循环通过退出循环进行优化,但设置
I=l
来结束for循环听起来有点奇怪。相反,你为什么不使用
break
?我想这是一个个人习惯,如果有额外的代码,我从不喜欢
break
关键字对于
声明的第二部分,我希望执行它