亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何將對象的平面數組(可能有多個父對象)轉換為嵌套的對象數組

如何將對象的平面數組(可能有多個父對象)轉換為嵌套的對象數組

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 關注
  • 227 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號