цикл через объект дерева JSON и создать новый массив - PullRequest
0 голосов
/ 13 июня 2018

Есть ли способ, чтобы JS / ES6 проходил через объект и его потомков и создавал новый массив дерева объектов.

У меня есть этот объект дерева json:

[
{
    id: "001",
    deparmentsIds: [
        "002",
        "003"
    ],
    details: {
        parentDeparmentsId: null,
        name: "Top"
    }
},
{
    id: "002",
    deparmentsIds:[
        "004"
    ],
    details: {
        parentDeparmentsId: ["001"],
        name: "Operations"
    }
},
{
    id: "003",
    deparmentsIds:[]
    details: {
        parentDeparmentsId: ["001"],
        name: "Support"
    }
},
{
    id: "004",
    deparmentsIds:[]
    details: {
        parentDeparmentsId: ["002"],
        name: "Support operations"
    }
}

]

Я хочу создать новое дерево массива объектов, которое выглядит следующим образом: enter image description here

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Вы можете собрать всю информацию в объекте с помощью одного цикла и вернуть только узлы без родителя.

function getTree(data, root) {
    var o = {};
    data.forEach(({ id, details: { parentDeparmentsId: parent, name } }) => {
        var temp = { id, name };
        if (o[id] && o[id].children) {
            temp.children = o[id].children;
        }
        o[id] = temp;
        o[parent] = o[parent] || {};
        o[parent].children = o[parent].children || [];
        o[parent].children.push(temp);
    });
    return o[root].children;
}

var data = [{ id: "001", deparmentsIds: ["002", "003"], details: { parentDeparmentsId: null, name: "Top" } }, { id: "002", deparmentsIds: ["004"], details: { parentDeparmentsId: ["001"], name: "Operations" } }, { id: "003", deparmentsIds: [], details: { parentDeparmentsId: ["001"], name: "Support" } }, { id: "004", deparmentsIds: [], details: { parentDeparmentsId: ["002"], name: "Support operations" } }],
    tree = getTree(data, null);

console.log(tree);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 13 июня 2018

Вы можете создать рекурсивную функцию с помощью методов reduce и map для создания структуры вложенных объектов.

const data = [{"id":"001","deparmentsIds":["002","003"],"details":{"parentDeparmentsId":null,"name":"Top"}},{"id":"002","deparmentsIds":["004"],"details":{"parentDeparmentsId":"001","name":"Operations"}},{"id":"003","deparmentsIds":[],"details":{"parentDeparmentsId":"001","name":"Support"}},{"id":"004","deparmentsIds":[],"details":{"parentDeparmentsId":"002","name":"Support operations"}}]

function tree(input, parentId) {
  return input.reduce((r, e) => {
    if (e.id == parentId || parentId == undefined && e.details.parentDeparmentsId == null) {
      const children = [].concat(...e.deparmentsIds.map(id => tree(input, id)))
      const obj = {
        [e.details.name]: children
      }
      r.push(obj)
    }
    return r;
  }, [])
}

const result = tree(data)
console.log(result)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...