Группировать вложенные массивы в объекте в js (Tree Vue.js) - PullRequest
0 голосов
/ 02 марта 2019

Это мой массив объектов: я использую vue.js, мне нужно дерево, подобное этому, чтобы сохранить структуру дерева: https://vuejs.org/v2/examples/tree-view.html

[
   {
      "name": "",
      "children": []
   },
   {
      "name": "",
      "children": [
         {
            "name": "Leggi",
            "children": []
         }
      ]
   },
   {
      "name": "",
      "children": [
         {
            "name": "Leggi",
            "children": [
               {
                  "name": "2010",
                  "children": []
               }
            ]
         }
      ]
   },
   {
      "name": "",
      "children": [
         {
            "name": "Leggi",
            "children": [
               {
                  "name": "2011",
                  "children": []
               }
            ]
         }
      ]
   },
   {
      "name": "",
      "children": [
         {
            "name": "Titoli",
            "children": []
         }
      ]
   }
]

Мне нужна функция для извлечения объекта, сгруппированного по имени, с его дочерними элементами

{
   "name": "",
   "children": [
      {
         "name": "Leggi",
         "children": [
            {
               "name": "2010",
               "children": []
            },
            {
               "name": "2011",
               "children": []
            }
         ],
         "name": "Titoli",
         "children": []
      }
   ]
}
Я хотел бы знать, есть ли там простой способ (вместо написания рекурсивной функции), например, использование lodash или что-то подобное.Спасибо

Ответы [ 3 ]

0 голосов
/ 02 марта 2019
 treeArchive.forEach(element => {
      element.children.forEach(father => {
        if (result.children.length != 0) {
          cicleChildrens(result, father); 
            function cicleChildrens(padrePrecedente, nuovoPadre){
            var brother = padrePrecedente.children.find(x => x.name == nuovoPadre.name);
            if (brother != undefined) cicleChildrens(brother, nuovoPadre.children[0]);
            else padrePrecedente.children.push(nuovoPadre);
            };
        }
        else result.children.push(father);
      });
  });

В настоящее время это мой рабочий код .. Я пытаюсь понять ваш код @ chriss

0 голосов
/ 03 марта 2019

Я думаю, что я реализовал более читаемый ответ:

const rootTree = [];
const putInTree = (tree, node) => {
    let nodeInTree = tree.find(x => x.name === node.name);
    if (!nodeInTree) {
        nodeInTree = {name: node.name, children: []};
        tree.push(nodeInTree);
    }
    if (node.children[0]) putInTree(nodeInTree.children, node.children[0])
}
nodes.forEach(node => putInTree(rootTree, node));

nodes вот ваш стартовый массив, дайте мне знать, если это нормально

0 голосов
/ 02 марта 2019

Попробуйте это:

function getGroupedByName(given) {
    let result = given.reduce((a, b) => { 
        if(!a[b.name]) a[b.name] = [];
        a[b.name] = [...a[b.name], ...b.children];
        return a;
    }, {});
    result = Object.keys(result).map(key => ({name: key, children: getByName(result[key])}));
    return result;
}

const o = []; // your initial object
getGroupedByName(o, "Leggi")

Он возвращает его в виде массива объектов, имеющих реквизиты имен и дочерних элементов, так как я предполагаю, что первый уровень также может иметь несколько разных имен, не все из которых являются ""

Сначала идет через все элементы в массиве и группирует их в объект со структурой {name: children}, где children - это массив всех потомков для одной и той же группы.Для каждого дочернего массива он выполняет одну и ту же операцию, проходя через массив и объединяя его в объект {name: children}.

На данный момент мы имеем следующую структуру:

{ "": { 
 Leggi: {...}
}}

Когда все сгруппировано, Object.keys зацикливает все ключи и разбивает его на массив, где ключ это имя и значение дочернее свойство

...