console
let nodeList = [
{ id: '1-1', children: [{ id: '1-2-1' }, { id: '1-2-2' }] },
{ id: '2-1' },
{ id: '3-1', children: [{ id: '3-2-1', children: [{ id: '3-3-1' }] }] }
]
function filterTree(tree = [], validate = () => { }, param = [], arr = []) {
if (!tree.length) return []
for (let item of tree) {
if (!validate.apply(null, [item, param])) continue
let node = { ...item, children: [] }
arr.push(node)
if (item.children && item.children.length) filterTree(item.children, validate, param, node.children)
}
return arr
}
function validate(node, map) {
console.log("过滤数据2:", node, map)
return map.includes(node.id)
}
let rs = [];
filterTree(nodeList, validate, new Array('1-2-1', '3-1'), rs)
console.log(rs)
function filter2(nodes, predicate) {
if (!(nodes && nodes.length)) {
return [];
}
const newChildren = [];
for (const node of nodes) {
if (predicate(node)) {
newChildren.push(node);
node.children = filter2(node.children, predicate);
} else {
newChildren.push(...filter2(node.children, predicate));
}
}
return newChildren;
}
const tree = filter2(nodeList, (node) => new Array('1-2-1', '3-1').includes(node.id));
console.log(tree)
function filterMethod(val, data, filterType) {
return val.includes(data[filterType])
}
function tableFilter(data, filter, filterType) {
const traverse = (data) => {
data.forEach(child => {
console.log("dddddd:",child)
child.visible = this.filterMethod(filter, child, filterType)
if (child.children) traverse(child.children)
if (!child.visible && child.children && child.children.length) {
let visible = !child.children.some(child => child.visible);
child.visible = visible === false;
}
})
}
traverse(data)
return this.filterDataByVisible(data)
}
function filterDataByVisible(data) {
return data.filter(item => {
if (item.children) {
item.children = this.filterDataByVisible(item.children)
}
if (item.visible) {
return true
}
})
}
console.log(tableFilter(nodeList,['1-2-1', '3-1'],"id"))
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<script>
const a = [
{
id: 1,
children: {
id: 2,
},
},
{
id: 3,
children: {
id: 4,
children: {
id: 5,
children: {
id: 6,
},
},
},
},
];
function deal(nodes, predicate) {
if (!(nodes && nodes.length)) {
return [];
}
const newChildren = [];
for (const node of nodes) {
if (predicate(node)) {
newChildren.push(node);
node.children = deal(node.children, predicate);
} else {
newChildren.push(...deal(node.children, predicate));
}
}
return newChildren;
}
console.log("a", JSON.stringify(a));
const result = deal(a, (node) => node.id == 1||node.id == 4);
console.log("result", result);
</script>
</body>
</html>