javascript 如何搜索基于对象的树?

8dtrkrch  于 2022-11-20  发布在  Java
关注(0)|答案(2)|浏览(167)

我有一个树,我想找到正确的节点并将数据插入到对象中。

const resultTree = {
  grand_parent: {
    parent: {
      child: {},
    },
    sibling: {
      cousin: {},
    },
  },
};

例如,在child中插入grand_child。
因此结果如下所示:

const resultTree = {
  grand_parent: {
    parent: {
      child: {
        grand_child: {}, // inserted grand_child here
      },
    },
    sibling: {
      cousin: {},
    },
  },
};

我可以根据需要插入更多内容,例如,在child中插入兄弟

const resultTree = {
  grand_parent: {
    parent: {
      child: {
        grand_child: {}, 
        sibling: {} // inserted sibling here
      },
    },
    sibling: {
      cousin: {},
    },
  },
};

这就是我现在拥有的,但它不起作用

const findAndInsert = (node: string, tree: Tree, parentNode: string) => {
  if (!!tree[parentNode]) {
    tree[parentNode][node] = {};
  } else {
    Object.keys(tree[parentNode]).forEach((n) => {
      findAndInsert(node, tree[n], parentNode);
    });
  }
};
zzwlnbp8

zzwlnbp81#

主要问题是Object.keys(tree[parentNode]),因为您刚刚确认了parentNode键在tree中不存在。
我还建议在插入后停止进一步的查找,可以通过返回一个布尔值来表示插入已经发生,然后使用some而不是forEach来实现,另外,实际上并不需要对键进行迭代,而是对 * 值 * 进行迭代,所以使用Object.values

const findAndInsert = (node, tree, parentNode) => {
  if (!!tree[parentNode]) {
    tree[parentNode][node] = {};
    return true;
  }
  return Object.values(tree).some((n) =>
    findAndInsert(node, n, parentNode)
  );
};

const tree = {
  grand_parent: {
    parent: {
      child: {},
    },
    sibling: {
      cousin: {},
    },
  },
};

findAndInsert("grandchild", tree, "child");
findAndInsert("sibling", tree, "child");
console.log(tree);
hgb9j2n6

hgb9j2n62#

这个想法是正确的,只是看起来你有一个打字错误,它是Object.keys(tree)而不是Object.keys(tree[parentNode])

相关问题