在lodash中嵌套一个父子关系,给定父id和子

Nesting a parent child relationship in lodash, given the parent id and children

本文关键字:父子关系 和子 id 一个 lodash 嵌套      更新时间:2023-09-26

如果父类和子类作为属性给定,我如何能够嵌套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的简单组是做不到的。

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;
    }, {});
}

看看更新后的小提琴:

var data = getData();
_.keys(data).forEach(function(id){
    var element = data[id];
    if (element.children === null){
        element.children = [];
    }
    element.isCategory = true;
    element.items.forEach(function(item){
        item.isCategory = false;
    })
});
_.keys(data).forEach(function(id){
    var element = data[id];
    element.children = element.children.map(function(childId){
      return data[childId];
    }).concat(element.items);
});
_.keys(data).forEach(function(id){
    delete data[id].items;
});
console.log(JSON.stringify(_.findWhere(_.values(data), {'parent': null})));