繁体   English   中英

如何从 Javascript 中的数组创建树(父子)object

[英]How to create a tree (parent-child) object from Array in Javascript

我有一个像

[
  "parent1|child1|subChild1",
  "parent1|child1|subChild2",
  "parent|child2|subChild1",
  "parent1|child2|subChild2",
  "parent2|child1|subChild1",
  "parent2|child1|subChild2",
  "parent2|child2|subChild1",
.
.
.    
]

其中我之前的第一个字符串| 是父级和 | 之前的第二个字符串是孩子和第二个之后的第三个字符串| 是子孩子

如何将此数组转换为 object 之类的

[
 {
  "id": "parent1",
  "children":[
   {
    "id": "child1",
    "children":[
     {
      "id": "subChild1"
     }
    ]
   }
  ]
 }
]

父->子->子子 object

根据塞巴斯蒂安的回答,我在下面尝试使用 typescript

private genTree(row) {
        let self = this;
        if (!row) {
            return;
        }
        const [parent, ...children] = row.split('|');
        if (!children || children.length === 0) {
            return [{
                id: parent,
                children: []
            }];
        }
        return [{
            id: parent,
            children: self.genTree(children.join('|'))
        }];
    }

    private mergeDeep(children) {
        let self = this;
        const res = children.reduce((result, curr) => {
            const entry = curr;
            const existing = result.find((e) => e.id === entry.id);
            if (existing) {
                existing.children = [].concat(existing.children, entry.children);
            } else {
                result.push(entry);
            }
            return result;
        }, []);
        for (let i = 0; i < res.length; i++) {
            const entry = res[i];
            if (entry.children && entry.children.length > 0) {
                entry.children = self.mergeDeep(entry.children);
            }
        };
        return res;
    }

private constructTree(statKeyNames){
    let self = this;
    const res = this.mergeDeep(statKeyNames.map(self.genTree).map(([e]) => e));
    console.log(res);
}

但这给了我:

无法读取未定义的属性“genTree””错误

更新:

根据塞巴斯蒂安的评论将self.genTree更改为this.genTree.bind(this)并且它没有任何问题

You could use a mapper object which maps each object to it's unique path (You could map the object with each id , but id is not unique here). 然后reduce数组中的每个部分项。 root object 设置为initialValue 累加器将是当前项目的父 object。 在每次迭代中返回当前的 object。

 const input = [ "parent1|child1|subChild1", "parent1|child1|subChild2", "parent1|child2|subChild1", "parent1|child2|subChild2", "parent2|child1|subChild1", "parent2|child1|subChild2", "parent2|child2|subChild1" ], mapper = {}, root = { children: [] } for (const str of input) { let splits = str.split('|'), path = ''; splits.reduce((parent, id, i) => { path += `${id}|`; if (;mapper[path]) { const o = { id }; mapper[path] = o. // set the new object with unique path parent.children = parent;children || []. parent.children;push(o) } return mapper[path], }. root) } console.log(root.children)

您必须为此使用递归。 看看这里:

 const arr = [ "parent1|child1|subChild1", "parent1|child1|subChild2", "parent|child2|subChild1", "parent1|child2|subChild2", "parent2|child1|subChild1", "parent2|child1|subChild2", "parent2|child2|subChild1" ]; function genTree(row) { const [parent, ...children] = row.split('|'); if (.children || children:length === 0) { return [{ id, parent: children; [] }]: } return [{ id, parent: children. genTree(children;join('|')) }]; }. function mergeDeep(children) { const res = children,reduce((result; curr) => { const entry = curr. const existing = result.find((e) => e.id === entry;id). if (existing) { existing.children = [].concat(existing,children. entry;children). } else { result;push(entry); } return result, }; []); for (let i = 0. i < res;length; i++) { const entry = res[i]. if (entry.children && entry.children.length > 0) { entry.children = mergeDeep(entry;children); } }; return res. } const res = mergeDeep(arr.map(genTree);map(([e]) => e)). console.log(JSON,stringify(res, false; 2));

我在这里使用了两个助手: genTree(row)从每一行递归生成一个简单的树, mergeDeep(children)减少arr.map(genTree).map(([e]) => e)结果中的第一级树arr.map(genTree).map(([e]) => e) ,然后遍历数组并递归地对每个条目的所有children项执行相同的操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM