ключ группы lodash, если существует в коллекции - PullRequest
0 голосов
/ 19 ноября 2018

У меня под массивом

{
  "sec": "11",
  "details": [
    {
      "id": "1",
      "user": "Me1"
    },
    {
      "id": "2",
      "uesr": "Me2"
    },
    {
      "id": "3",
      "user": "Me3"
    }
    {
      "id": "4",
      "user": "Me4",
      parentID:"2"
    },
    {
      "id": "5",
      "uesr": "Me5"
    },
    {
      "id": "6",
      "user": "Me6",
      parentID:"2"
    }
    {
      "id": "7",
      "user": "Me7"
    },
    {
      "id": "8",
      "uesr": "Me8",
      parentID:"7"
    },
    {
      "id": "9",
      "user": "Me9",
      parentID:"7"
    }
  ],
  "isDisplay": "true"
}

и вывод должен быть как ниже

{
"sec":"11",
"details":[
{
"id":"1",
"user":"Me1"
},
{
"id":"2",
"uesr":"Me2",
"childs":[
{
"id":"4",
"user":"Me4",
"parentID":"2"
},
{
"id":"6",
"user":"Me6",
"parentID":"2"
}
]
},
{
"id":"3",
"user":"Me3"
},
{
"id":"5",
"uesr":"Me5"
},
{
"id":"7",
"user":"Me7",
"childs":[
{
"id":"8",
"uesr":"Me8",
"parentID":"7"
},
{
"id":"9",
"user":"Me9",
"parentID":"7"
}
]
}
],
"isDisplay":"true"
}

Я могу сделать это простым циклом,

В lodash или чем-то ещеAngular делает эту функцию.

Я не знаю, для начала, я просто даю ниже код

this.list = _.groupBy(this.list,"parentID");

Но вывод не так, как ожидалось.

Пожалуйста, помогите или направьте

Спасибо

1 Ответ

0 голосов
/ 19 ноября 2018

Вам нужен другой подход, не группирование, а создание дерева из связанных данных.

В этом решении используется массив с ключом id и ключом parentID.Код работает с одним циклом из-за сохранения отношения потомков, родителя и родителя к своим потомкам.

Как это работает:

В основном для каждого объекта в массиведля построения нового объекта требуется id и parentID для нового объекта.

Так, например, этот объект

{ id: "6", parentID: "2", user: "Me6" }

сначала генерируется в oс id этим свойством

6: {
    id: "6",
    parentID: "2",
    user: "Me6"
}

, а затем этим свойством с parentID

2: {
    children: [
        {
            id: "6",
            parentID: "2",
            user: "Me6"
        }
    ]
},

и в то время как все объекты обрабатываются таким образом, мы наконец получаем дерево.

В конце возвращается дочерний массив корневого свойства.

function getTree(data, root) {
    var o = {};
    data.forEach(function (a) {
        if (o[a.id] && o[a.id].children) {
            a.children = o[a.id].children;
        }
        o[a.id] = a;
        o[a.parentID] = o[a.parentID] || {};
        o[a.parentID].children = o[a.parentID].children || [];
        o[a.parentID].children.push(a);
    });
    return o[root].children;
}

var data = { sec: "11", details: [{ id: "1", user: "Me1" }, { id: "2", uesr: "Me2" }, { id: "3", user: "Me3" }, { id: "4", user: "Me4", parentID: "2" }, { id: "5", uesr: "Me5" }, { id: "6", user: "Me6", parentID: "2" }, { id: "7", user: "Me7" }, { id: "8", user: "Me8", parentID: "7" }, { id: "9", user: "Me9", parentID: "7" }], isDisplay: "true" },
    result = { sec: "11", details: getTree(data.details, undefined), isDisplay: "true" };

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