数组对比返回一个满足要求的新数组
遇到一个问题,写出来的复杂度特别高,对特殊情况的处理不够友好,请教大佬们,如何解决这个问题
回答:
var nodeMap = {}node.forEach(nodeId => {
nodeMap[nodeId] = true
})
function filter(data, dataLevel = 0) {
var append = []
return data.filter(item => {
var inNodes = (item.id in nodeMap)
if ('children' in item && item.children.length > 0) {
var filterChildren = dataLevel + 1 < 2 ? filter(item.children, dataLevel + 1) : item.children
if (inNodes) {
item.children = filterChildren
} else if (dataLevel + 1 < 2) {
filterChildren.forEach(child => {
append.push(child)
})
}
}
return inNodes
}).concat(append);
}
console.log(JSON.stringify(filter(arr)))
利用map优化nodeId查询
这个复杂度大概是O(n);递归
(这里使用filter,会生成新数组,如果要考虑内存空间的优化,可以使用更原生的方式删除数组值)
回答:
前不久刚写了一篇:过滤/筛选树节点
再看了一遍,我发现这个事情不简单。
比如下面这两棵子树,绿色的两个节点都在查找列表中,没在其中的红色节点被干掉了
这样看来,规则应该是保留列出来的节点,未列出来的干掉。然而,紧接着的下面两棵子树打破了这个规则(以前面一棵子树为例):
这棵子树只有两个二级节点在列表中,但所有节点都被保留下来了。如果说这是符合保留查找到的节点的完整子树的情况,那前面那两棵树的子节点也应该完全保留,而不应该丢掉其中一些……而且更神奇的是,12100000
这个子树根没保留,直接将其子树嫁接到了它的上级节点上……。
如此看来,我那篇博文里确实找不到完全匹配的内容。而且,我现在也搞不明白你的过滤和转换规则到底是怎么样的。这个规则需要你来表述。
以上是 数组对比返回一个满足要求的新数组 的全部内容, 来源链接: utcz.com/p/936255.html