给定父级ID和子级,在lodash中嵌套父级子级关系

乔伊·希波利托(Joey Hipolito)

如果将父项及其子项作为属性给出,我将如何嵌套json对象。

数据如下:

   "1": {
        "id": 1,
        "name": "foo",
        "parent": null,
        "root": 1,
        "children": [2, 4, 6],
        "posts":[
            { "id": "1", "name": "item1" },
            { "id": "2", "name": "item2" },
            { "id": "3", "name": "item3" }
        ]
    },
    "2": {
        "id": 2,
        "name": "bar",
        "parent": 1,
        "root": 1,
        "children": null,
        "posts":[
            { "id": "4", "name": "item4" }
        ]
    },
    "3": {
        "id": 3,
        "name": "bazz",
        "parent": null,
        "root": 3,
        "children": [5, 7],
        "posts":[
            { "id": "5", "name": "item5" },
            { "id": "6", "name": "item6" }
        ]
    },
   ....

使用lodash的简单groupby不会做到这一点。

var group = _.groupBy(data, 'parent');

这是一个小提琴:

http://jsfiddle.net/tzugzo8a/1/

问题的上下文是带有子类别的嵌套类别,类别可以包含类别和帖子。

基本上,我不想为孩子和职位设置不同的属性,因为它们都是父母的孩子。

所需的输出

    "1": {
        "id": 1,
        "name": "foo",
        "parent": null,
        "root": 1,
        "isCategory": true,
        "children": [
             {
                 "id": 2,
                 "name": "bar",
                 "parent": 1,
                 "root": 1,
                 "isCategory": true,
                 "children": null
             },
             { "id": "1", "name": "item1", isCategory: false },
             { "id": "2", "name": "item2", isCategory: false },
             { "id": "3", "name": "item3", isCategory: false }

        ]
        ...
    }
或德罗里

这是我对这个问题的看法(小提琴):

var data = getData();

var group = getTree(data);

console.log(group);

function getTree(flat) {
    return _.reduce(flat, function (treeObj, item, prop, flatTree) {
        var children = _.map(item.children, function (childId) {
            return _.set(flatTree[childId], 'isCategory', true);
        }).concat(_.map(item.items, function(item) {
            return _.set(item, 'isCategory', false);
        }));

        item.children = !!children.length ? children : null;

        delete item.items;

        item.parent === null && (treeObj[prop] = item);

        return treeObj;
    }, {});
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章