【发布时间】:2019-08-03 18:37:41
【问题描述】:
我想过滤一个对象数组,递归地基于过滤值并过滤掉“空节点”的输入数组。
这是一个例子:
const nodes = [{
value: 'World',
children: [{
value: 'Europe',
children: [{
value: 'BeNeLux',
children: [{
value: 'NL'
}, {
value: 'DE'
}, {
value: 'LU'
}]
}, {
value: 'AL'
}, {
value: 'ZW'
}, {
value: 'UK' // lol
}]
}]
}]
在上面的数组中,节点有:value 和可选的children。
我想要一个函数,我提供一个输入数组,该数组应该过滤上面列出的 nodes 数组的值 + 子项,所以:
const valuesToBeRemoved = ['NL', 'DE', 'LU', 'ZW', 'UK']
那么预期的输出应该是:
const expectedNodesOutput = [{
value: 'World',
children: [{
value: 'Europe',
children: [{
value: 'AL'
}]
}]
}]
这是我尝试过的,但它不能正常工作,因为它没有正确递归,它应该过滤掉空节点(也很好奇其他人如何提出可能更清洁的解决方案):
const filterNodes = (filter, node) => {
if (node.children) {
const children = node.children
.map(child => filterNodes(filter, child))
.filter(x => x)
if (children.length) {
return {
...node,
children
}
}
} else {
if (!filter.includes(node.value)) {
return node
}
}
}
const getFilteredNodes = (filter, nodes) => {
return filterNodes(filter, { children: nodes })?.children || []
}
【问题讨论】:
-
@alfasin 不确定,代码没有按预期工作
-
@alfasin 不,不是。代码审查要求现有代码按预期工作。问题中明确指出现有代码没有。
-
然后澄清你的问题,现在你问“是否会有更清洁/更有效的方式”,这意味着这段代码有效。
-
我没有投反对票,但老实说,我认为这个问题在清理之前不应该被投赞成票......
-
@dfhwze 它本可以阻止本网站上一半的问题 LoL :)
标签: javascript recursion filtering