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

我有一系列通过 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,则此方法可以正常工作。但是,我不确定如何使其适用于具有对象数组作为值的父键。


HUH函数
浏览 211回答 2
2回答

动漫人物

您可以使用_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; }

幕布斯6054654

您可以保留平面 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));
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript