数组对比返回一个满足要求的新数组

数组对比返回一个满足要求的新数组

遇到一个问题,写出来的复杂度特别高,对特殊情况的处理不够友好,请教大佬们,如何解决这个问题


回答:

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,会生成新数组,如果要考虑内存空间的优化,可以使用更原生的方式删除数组值)


回答:

前不久刚写了一篇:过滤/筛选树节点


再看了一遍,我发现这个事情不简单。

比如下面这两棵子树,绿色的两个节点都在查找列表中,没在其中的红色节点被干掉了

flowchart LR

%%{ init: { "theme": "forest" } }%%

classDef remove fill:#ffeeee,stroke:#cc6666;

12020000 --> 12020100([12020100]):::remove

12020000 --> 12020200

12030000 --> 12030100

12030000 --> 12030200([12020100]):::remove

12030000 --> 12030300

12030000 --> 12030400

12030000 --> 12030500

12030000 --> 12030600

这样看来,规则应该是保留列出来的节点,未列出来的干掉。然而,紧接着的下面两棵子树打破了这个规则(以前面一棵子树为例):

flowchart LR

%%{ init: { "theme": "forest" } }%%

classDef remove fill:#ffeeee,stroke:#cc6666;

12100000([12100000]):::remove -.-> 12100100

12100100 --> 12100101:::remove

12100100 --> 12100102:::remove

12100100 --> 12100103:::remove

12100000 -.-> 1211000

1211000 --> 12100111:::remove

1211000 --> 12100112:::remove

1211000 --> 12100113:::remove

这棵子树只有两个二级节点在列表中,但所有节点都被保留下来了。如果说这是符合保留查找到的节点的完整子树的情况,那前面那两棵树的子节点也应该完全保留,而不应该丢掉其中一些……而且更神奇的是,12100000 这个子树根没保留,直接将其子树嫁接到了它的上级节点上……。

如此看来,我那篇博文里确实找不到完全匹配的内容。而且,我现在也搞不明白你的过滤和转换规则到底是怎么样的。这个规则需要你来表述。

以上是 数组对比返回一个满足要求的新数组 的全部内容, 来源链接: utcz.com/p/936255.html

回到顶部