2个多维数组如何查找交集打标识

2个层级比较深的数组A和B 并且不固定层级深度 他们有相同的ID 如果存在 就在A数组相应的对象下打个标识

var A= [{
        id: 1
    }, {
        id: 2,
        children: [{
            id: 3
        }, {
            id: 4
        }, {
            id: 5,
            children: [{
                id: 6
            }]
        }]
    }];
    var B= [{
        id: 1
    }, {
        id: 2,
        children: [{
            id: 5,
            children: [{
                id: 6
            }]
        }]
    }];
    let c = method(A,B)
    //结果
    c = [{
        id: 1,
        disabled:true
    }, {
        id: 2,
        disabled:true,
        children: [{
            id: 3
        }, {
            id: 4
        }, {
            id: 5,
            disabled:true,
            children: [{
                id: 6,
                disabled:true
            }]
        }]
    }];
阅读 2.2k
2 个回答
function method(A, B) {
  var ret = []
  A.forEach(itemA => {
    var r = B.find(itemB => itemB.id === itemA.id)
    var obj = Object.assign({}, itemA)
    ret.push(obj)
    if (r) {
      obj.disabled = true
      if (itemA.children && r.children) {
        obj.children = method(itemA.children, r.children)
      }
    }
  })
  return ret
}

如果量较小的话不停交叉遍历树也可以接受,若存下 B 的点则可以为后续加速,思路供参考

function method (treeA, treeB) {
  return dfs(treeA, new Set(flat(treeB)))
}

function dfs (root, dict) {
  for (node of root) {
    if (dict.has(node.id)) {
      node.disabled = true
    }
    if (node.children) {
      dfs(node.children, dict)
    }
  }
  return root
}

function flat (root, path = []) {
  for (node of root) {
    path.push(node.id)
    if (node.children) {
      flat(node.children, path)
    }
  }
  return path
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题