为了账号安全,请及时绑定邮箱和手机立即绑定

如何将对象的平面数组(可能有多个父对象)转换为嵌套的对象数组

如何将对象的平面数组(可能有多个父对象)转换为嵌套的对象数组

HUH函数 2021-08-20 15:10:11
我有一系列通过 parentId 相互关联的任务。但是,任何任务都可以有多个父级。因此不一定是简单的单树层次结构。我想要实现的是,我想要一个孩子[],而不是父母[]。然而,我似乎无法理解如何递归地处理这个问题。任何帮助将不胜感激。这是平面 JSON 数组[  {    "_id": "4b04e450-06d5-4453-8d50-d3b2a70d9b2d",    "task_name": "Parent2",    "parents": []  },  {    "_id": "a15ca08e-f13b-4d73-a496-ba23832ea233",    "task_name": "Endpoints",    "parents": [      {        "_id": "97bbf892-8a2a-4f45-befd-4fdbebded04b",        "task_name": "Parent1"      },      {        "_id": "4b04e450-06d5-4453-8d50-d3b2a70d9b2d",        "task_name": "Parent2"      }    ]  },  {    "_id": "ee78316a-491e-4db5-8f82-13b12b5b86fc",    "task_name": "Mapping",    "parents": [      {        "_id": "97bbf892-8a2a-4f45-befd-4fdbebded04b",        "task_name": "Parent1"      }    ]  },  {    "_id": "97bbf892-8a2a-4f45-befd-4fdbebded04b",    "task_name": "Parent1",    "parents": []  }]我想实现的是以下[  {    "_id": "97bbf892-8a2a-4f45-befd-4fdbebded04b",    "task_name": "Parent1",    "children": [      {        "_id": "ee78316a-491e-4db5-8f82-13b12b5b86fc",        "task_name": "Mapping",        "children": []      },      {        "_id": "a15ca08e-f13b-4d73-a496-ba23832ea233",        "task_name": "Endpoints",        "children": []      }    ]  },  {    "_id": "4b04e450-06d5-4453-8d50-d3b2a70d9b2d",    "task_name": "Parent2",    "children": [      {        "_id": "a15ca08e-f13b-4d73-a496-ba23832ea233",        "task_name": "Endpoints",        "children": []      }    ]  }]我试过的function transform(list, idAttr, parentAttr, childrenAttr) {    if (!idAttr) idAttr = '_id';    if (!parentAttr) parentAttr = 'parents';    if (!childrenAttr) childrenAttr = 'children';如果原始数组中的父键等于任务的 _id,则此方法可以正常工作。但是,我不确定如何使其适用于具有对象数组作为值的父键。
查看完整描述

2 回答

?
动漫人物

TA贡献1815条经验 获得超10个赞

您可以使用_id作为键的对象并将其父对象与它们的关系一起存储。最后取没有父项的子项。


var data = [{ _id: "4b04e450-06d5-4453-8d50-d3b2a70d9b2d", task_name: "Parent2", parents: [] }, { _id: "a15ca08e-f13b-4d73-a496-ba23832ea233", task_name: "Endpoints", parents: [{ _id: "97bbf892-8a2a-4f45-befd-4fdbebded04b", task_name: "Parent1" }, { _id: "4b04e450-06d5-4453-8d50-d3b2a70d9b2d", task_name: "Parent2" }] }, { _id: "ee78316a-491e-4db5-8f82-13b12b5b86fc", task_name: "Mapping", parents: [{ _id: "97bbf892-8a2a-4f45-befd-4fdbebded04b", task_name: "Parent1" }] }, { _id: "97bbf892-8a2a-4f45-befd-4fdbebded04b", task_name: "Parent1", parents: [] }],

    tree = function (data, root) {

        var t = {};

        data.forEach(({ parents, ...o }) => {

            Object.assign(t[o._id] = t[o._id] || {}, o);

            if (!parents.length) {

                t[root] = t[root] || {};

                t[root].children = t[root].children || [];

                t[root].children.push(t[o._id]);

                return;

            }

            parents.forEach(p => {

                Object.assign(t[p._id] = t[p._id] || {}, p);

                t[p._id].children = t[p._id].children || [];

                t[p._id].children.push(t[o._id]);

            });

        });

        return t[root].children;

    }(data);


console.log(tree);

.as-console-wrapper { max-height: 100% !important; top: 0; }


查看完整回答
反对 回复 2021-08-20
?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

您可以保留平面 JSON 数组结构并仅存储 Id 以便像这样交叉引用(ID 只是示例)


    [

        {

            "_id": "97bbf892-8a2a-4f45-befd-4fdbebded04b",

            "task_name": "Task1",

            "children": [

                "ee78316a-491e-4db5-8f82-13b12b5b86fc",

                "a15ca08e-f13b-4d73-a496-ba23832ea233"

            ],

            "parents": [

                "ee78316a-491e-4db5-8f82-13b12b5b86fc",

                "a15ca08e-f13b-4d73-a496-ba23832ea233"

            ]

        },

        {

            "_id": "97bbf892-8a2a-4f45-befd-4fdbebded04b",

            "task_name": "Task2",

            "children": [

                "ee78316a-491e-4db5-8f82-13b12b5b86fc",

                "a15ca08e-f13b-4d73-a496-ba23832ea233"

            ],

            "parents": [

                "ee78316a-491e-4db5-8f82-13b12b5b86fc",

                "a15ca08e-f13b-4d73-a496-ba23832ea233"

            ]

        },

        {

            "_id": "97bbf892-8a2a-4f45-befd-4fdbebded04b",

            "task_name": "Task3",

            "children": [

                "ee78316a-491e-4db5-8f82-13b12b5b86fc",

                "a15ca08e-f13b-4d73-a496-ba23832ea233"

            ],

            "parents": [

                "ee78316a-491e-4db5-8f82-13b12b5b86fc",

                "a15ca08e-f13b-4d73-a496-ba23832ea233"

            ]

        }

    ]

或者,如果您想以您目前希望的方式实现它,您可以使用此功能。没有完全测试,但你明白了


var tasks =     [

  {

    "_id": "4b04e450-06d5-4453-8d50-d3b2a70d9b2d",

    "task_name": "Parent2",

    "parents": []

  },

  {

    "_id": "a15ca08e-f13b-4d73-a496-ba23832ea233",

    "task_name": "Endpoints",

    "parents": [

      {

        "_id": "97bbf892-8a2a-4f45-befd-4fdbebded04b",

        "task_name": "Parent1"

      },

      {

        "_id": "4b04e450-06d5-4453-8d50-d3b2a70d9b2d",

        "task_name": "Parent2"

      }

    ]

  },

  {

    "_id": "ee78316a-491e-4db5-8f82-13b12b5b86fc",

    "task_name": "Mapping",

    "parents": [

      {

        "_id": "97bbf892-8a2a-4f45-befd-4fdbebded04b",

        "task_name": "Parent1"

      }

    ]

  },

  {

    "_id": "97bbf892-8a2a-4f45-befd-4fdbebded04b",

    "task_name": "Parent1",

    "parents": []

  }

];


function transformTasks(tasks){

    var transformed = {};

    var transformedAsArray = [];

    for(var taskIndex in tasks){

        var task = tasks[taskIndex];

        if(transformed[task["_id"]] === undefined){

            transformed[task["_id"]] = {_id:task["_id"],task_name:task["task_name"],children:[]};

            transformedAsArray.push(transformed[task["_id"]]);

        }

        for(var parentIndex in task["parents"]){

            var parentTask = task["parents"][parentIndex];

            if(transformed[parentTask["_id"]] === undefined){

                transformed[parentTask["_id"]] = {_id:parentTask["_id"],task_name:parentTask["task_name"],children:[]};

                transformedAsArray.push(transformed[parentTask["_id"]]);

            }

            transformed[parentTask["_id"]].children.push(transformed[task["_id"]]);


        }

    }


    return transformedAsArray;

}


console.log(transformTasks(tasks));


查看完整回答
反对 回复 2021-08-20
  • 2 回答
  • 0 关注
  • 210 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信