'Deep nested Array of Objects, set parentId as property in subTask

I am trying to set the parentId as property of every subTask. I have a structure like this (For example), which can grow very big and deep:

[
  {
    "id": 0,
    "lane": 0,
    "name": "Task A",
    "start": 0,
    "end": 10000,
    "subTasks": [
      {
        "id": "0.1",
        "lane": 0,
        "name": "Subtask",
        "start": 0,
        "end": 10000,
        "class": "danger",
        "sublane": 0,
        "subTasks": [
          {
            "id": "0.1.1",
            "name": "Subtask",
            "start": 0,
            "end": 10000,
            "subTasks": [
              {
                "id": "0.1.1.1",
                "name": "Subtask",
                "start": 0,
                "end": 10000,
                "subTasks": [
                  {
                    "id": "0.1.1.1.1",
                    "name": "Subtask",
                    "start": 0,
                    "end": 10000
                  },
                  {
                    "id": "0.1.1.1.2",
                    "name": "Subtask",
                    "start": 0,
                    "end": 10000
                  }
                ]
              },
              {
                "id": "0.1.1.2",
                "name": "Subtask",
                "start": 0,
                "end": 10000
              }
            ]
          },
          {
            "id": "0.1.2",
            "name": "Subtask",
            "start": 0,
            "end": 10000
          },
          {
            "id": "0.1.3",
            "name": "Subtask",
            "start": 0,
            "end": 10000
          }
        ]
      },
      {
        "id": "0.2",
        "name": "Subtask",
        "start": 0,
        "end": 10000
      }
    ],
    "class": "danger",
    "sublane": 0
  },
  {
    "id": 1,
    "lane": 2,
    "name": "Task B",
    "start": 15000,
    "end": 25000,
    ],
    "class": "success",
    "sublane": 0
  }
]

I tried this, but it didnt work:

 addParentId: function () {
        for (let obj of taskss.data) {
            taskss.depthIteration(obj);
        }
    },

    depthIteration: function (obj) {
        if (obj.subTasks && obj.subCollapsed === false) {
            for (let item of obj.subTasks) {
                item.parentId = obj.id;
                this.depthIteration(item);
            }
        }
        return null;
    },

Now I want this data not just to be returned flatten, every task which is a subTask should have a parentId property. For example, the subTask with "id": "0.1.1" should also have a "parentId": "0.1". How can I do this?



Solution 1:[1]

const arr = [{
    id: 0,
    lane: 0,
    name: 'Task A',
    start: 0,
    end: 10000,
    subTasks: [{
        id: '0.1',
        lane: 0,
        name: 'Subtask',
        start: 0,
        end: 10000,
        class: 'danger',
        sublane: 0,
        subTasks: [{
            id: '0.1.1',
            name: 'Subtask',
            start: 0,
            end: 10000,
            subTasks: [{
                id: '0.1.1.1',
                name: 'Subtask',
                start: 0,
                end: 10000,
                subTasks: [{
                    id: '0.1.1.1.1',
                    name: 'Subtask',
                    start: 0,
                    end: 10000,
                  },
                  {
                    id: '0.1.1.1.2',
                    name: 'Subtask',
                    start: 0,
                    end: 10000,
                  },
                ],
              },
              {
                id: '0.1.1.2',
                name: 'Subtask',
                start: 0,
                end: 10000,
              },
            ],
          },
          {
            id: '0.1.2',
            name: 'Subtask',
            start: 0,
            end: 10000,
          },
          {
            id: '0.1.3',
            name: 'Subtask',
            start: 0,
            end: 10000,
          },
        ],
      },
      {
        id: '0.2',
        name: 'Subtask',
        start: 0,
        end: 10000,
      },
    ],
    class: 'danger',
    sublane: 0,
  },
  {
    id: 1,
    lane: 2,
    name: 'Task B',
    start: 15000,
    end: 25000,
    class: 'success',
    sublane: 0,
  },
];
const addParentId = (arr) => {
  arr.forEach((task) => {
    if (task.subTasks) {
      task.subTasks.forEach((subTask) => {
        subTask.parentId = task.id;
        if (subTask.subTasks) {
          addParentId(subTask.subTasks);
        }
      });
    }
  });
  return arr;
};
console.log(JSON.stringify(addParentId(arr), null, 2));

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Parvesh Kumar