我有一个对象数组,其中包括对象数组中的子对象,我需要在父数组中找到值或在该数组的子对象中找到值,等等。也许是递归的。我试着这样:
var array = [
{
id: 1,
value: 'value',
children: null
},
{
id: 2,
value: 'my value',
children: [
{
id: 'child1',
value: 'my value',
children: null
},
{
id: 'child2',
value: 'value',
children: null
},
{
id: 'child3',
value: 'value,
children: [
{
id: 'childchild1',
value: 'my value',
children: null
}
]
}
]
},
{
id: 3,
value: 'value',
children: null
},
{
id: 4,
value: 'my value',
children: null
}
]
function find(searchData, target){
return target.filter((f)=>{
if(f.value.includes(searchData)){
return true
}
if(f.children){
return find(searchData, f.children)
}
})
}
find('my', array)
它返回源数组,但我需要包含文本“ my”的数组
答案 0 :(得分:3)
由于具有嵌套结构,因此无法使用.filter
来获取所有嵌套对象-.filter
只会向您返回最顶层的匹配对象。取而代之的是,在初始调用时定义一个空数组,然后在一项通过测试时将push
传递给该数组,然后将该数组传递给每个递归调用。最后,返回该数组:
var array=[{id:1,value:'value',children:null},{id:2,value:'my value',children:[{id:'child1',value:'my value',children:null},{id:'child2',value:'value',children:null},{id:'child3',value:'value',children:[{id:'childchild1',value:'my value',children:null}]}]},{id:3,value:'value',children:null},{id:4,value:'my value'}];
function find(searchData, target, accum=[]){
target.forEach((f)=>{
if(f.children){
find(searchData, f.children, accum)
}
if(f.value.includes(searchData)){
accum.push(f);
}
});
return accum;
}
console.log(find('my', array));
(通过浏览器控制台比通过堆栈片段控制台更容易看到结果)
答案 1 :(得分:3)
这是一种功能编程样式的实现。为了简化输出,我只收集了匹配的id
值。如果需要整个对象,则将obj.id
替换为obj
:
const array = [{id: 1,value: 'value',children: null},{id: 2,value: 'my value',children: [{id: 'child1',value: 'my value',children: null},{id: 'child2',value: 'value',children: null},{id: 'child3',value: 'value' ,children: [{id: 'childchild1',value: 'my value',children: null}]}]},{id: 3,value: 'value',children: null},{id: 4,value: 'my value'}];
const find = (searchData, target) => (target || []).reduce(
(acc, obj) => acc.concat(obj.value.includes(searchData) ? obj.id : [],
find(searchData, obj.children)),
[]
);
const result = find('my', array);
console.log(result);
答案 2 :(得分:1)
为时已晚,这是另一个递归发现:
var array = [
{
id: 1,
value: 'value',
children: null,
},
{
id: 2,
value: 'my value',
children: [
{
id: 'child1',
value: 'my value',
children: null,
},
{
id: 'child2',
value: 'value',
children: null,
},
{
id: 'child3',
value: 'value',
children: [
{
id: 'childchild1',
value: 'my value',
children: null,
},
],
},
],
},
{
id: 3,
value: 'value',
children: null,
},
{
id: 4,
value: 'my value',
},
];
function find(search, arr) {
function recur(result, search, arr) {
if (!(arr && arr.length)) {
return result;
}
return result
.concat(
...arr.filter((item) =>
item.value.includes(search),
),
)
.concat(
...arr.map((item) =>
recur([], search, item.children),
),
);
}
return recur([], search, arr);
}
console.log(find('my', array));