js怎么获取数组对象中指定id的父对象

发布于 2022-09-13 00:14:10 字数 714 浏览 12 评论 0

let data = [
       {
        title: "江苏",
        key: "34fggg",
        children: [
          {
            title: "苏州",
            key: "sdf34",
            children: [
              { title: "吴中", key: "rt3we" },
              { title: "姑苏", key: "34rff" },
              { title: "园区", key: "34gdf" }
            ]
          },
          {
            title: "南京",
            key: "8kgkk",
            children: [
              { title: "鼓楼", key: "gdthj" },
            ]
          },
          {
            title: "无锡",
            key: "54y5y"
          }
        ]
      },
      {
        title: "浙江",
        key: "94kr"
      }
    ]

比如我知道‘吴中’的key是1-1-1
怎么获取‘苏州’的key

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

檐上三寸雪 2022-09-20 00:14:10

请看代码,利用递归和es6 some方法去遍历,如有帮助,望采纳

let getParentKey = (key, tree) => {
    let parentKey;
    for (let i = 0; i < tree.length; i++) {
        const node = tree[i];
        if (node.children) {
            if (node.children.some(item => item.key === key)) {
                parentKey = node.key;
            } else if (getParentKey(key, node.children)) {
                parentKey = getParentKey(key, node.children);
            }
        }
    }
    return parentKey;
};

image.png

清风夜微凉 2022-09-20 00:14:10

既然是要找到父级,那就将父级当成参数传递一下好了,然后挨层遍历,下面有个简单的实现可以参考一下,具体的返回值,还有是不是区分找到的是第一层没有父级,还是所有都没有找到,可以在返回值上做些处理。

const findParentKeyByChildKey = (data, key) => {
    return (function loop(data, parent, key) {
        for (const child of data) {
            if (child.key === key) {
                return parent && parent.key;
            }
            let parentKey;
            if (child.children && (parentKey = loop(child.children, child, key)) !== null) {
                return parentKey;
            }
        }
        return null;
    })(data, null, key);
};
無心 2022-09-20 00:14:10

一个比较清晰及避免重复计算的思路和实现过程是:

  1. 先构建反向字典表,子ID => 父ID
  2. 然后根据字典表中子ID获取父ID
// 用类的方式避免重复计算
class ParentDict {
  dict = new Map()  
  constructor(data) {
    const process = (children, key) => {
      for (const child of children) {
        this.dict.set(child.key, key)
        if (Array.isArray(child.children)) {
          process(child.children, child.key)
        }
      }
    }
    process(data, null)
  }
  getPid(cid) {
    return this.dict.get(cid)
  }
}

const dict = new ParentDict(data)

dict.getPid('1-1-2')  // 输出 1-1
dict.getPid('1-1')    // 输出 1
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文