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
值进行检查,如果我有子对象,我也需要检查该名称。例如:nameSUV
在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
关键字对于声明的第二部分,我希望执行它