我有一系列对象,其中包括来自对象数组的孩子,我需要在父阵列内找到值或在此数组的儿童内找到值等的值等。也许是递归的。我这样的tra脚:
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)
是返回源数组,但我需要数组,其中包括文本'我的''
因为您具有嵌套结构,因此无法使用.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));
(通过浏览器控制台比通过堆栈片段控制台更容易看到结果)
这是函数编程样式实现。为了简化输出,我刚刚收集了匹配项的id
值。如果需要整个对象,请用obj
替换obj.id
:
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);
太晚了,这是另一个递归发现:
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));