如何使用递归取出指定条件的数组,并且返回原结构?
原来结构:
[{ id:1,
type: '1',
name: '测试1',
children: [
{
id:2,
type: '2',
name: '测试2',
children: [
{
id:3,
type: '3',
name: '测试3',
}
]
}
]
}]
我想要得到type不等3的数据
如:
[{ id:1,
type: '1',
name: '测试1',
children: [
{
id:2,
type: '2',
name: '测试2',
}
]
}]
回答:
你试试这个方法:
function filterByType(arr) { return arr.map(obj => {
if (obj.type === '3') {
return undefined;
} else if (obj.children) {
obj.children = filterByType(obj.children).filter(Boolean);
}
return obj;
});
}
回答:
针对每一层的 children 进行 type !== 3 的方式过滤,然后重新赋值给当前层的 children 就好了,这个应该不难。
本文参与了SegmentFault 思否面试闯关挑战赛,欢迎正在阅读的你也加入。
回答:
function deepFilter(arr, cb) { return arr.reduce((res,v) => {
cb(v) && res.push({...v, children: deepFilter(v.children||[], cb)})
return res;
}, [])
}
deepFilter([{
id:1,
type: '1',
name: '测试1',
children: [
{
id:2,
type: '2',
name: '测试2',
children: [
{
id:3,
type: '3',
name: '测试3',
}
]
}
]
}], v => v.type != 3)
回答:
function filterDeep(list, callback) { if (Array.isArray(list)) {
var arr = [];
for (var i = 0; i < list.length; ++i) {
var item = list[i];
if (callback(item, i, list)) return;
item = filterDeep(item, callback);
if (item != null) arr.push(item);
}
return arr;
}
if (typeof list === "object" && list !== null) {
var obj = new list.constructor();
for (var key in list) {
var value = list[key];
if (callback(value, key, list)) return;
value = filterDeep(value, callback);
if (value != null) obj[key] = value;
}
return obj;
}
return list;
}
console.log(filterDeep([{
id: 1,
type: '1',
name: '测试1',
children: [{
id: 2,
type: '2',
name: '测试2',
children: [{
id: 3,
type: '3',
name: '测试3',
}]
}]
}], function (value, key) {
return key === "type" && value === "3";
}));
以上是 如何使用递归取出指定条件的数组,并且返回原结构? 的全部内容, 来源链接: utcz.com/p/933903.html