【问题标题】:Group nested arrays in an object in js (Tree Vue.js)在 js 中的对象中对嵌套数组进行分组(Tree Vue.js)
【发布时间】:2019-07-24 01:12:36
【问题描述】:

这是我的对象数组: 我正在使用 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 或附近的东西。 谢谢

【问题讨论】:

    标签: javascript arrays vue.js tree nested


    【解决方案1】:

    我认为我已经实现了一个更具可读性的答案:

    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这是你的起始数组,如果可以的话请告诉我

    【讨论】:

    • 顺便说一句,这是递归的,但它可以完成工作
    【解决方案2】:
     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

    【讨论】:

      【解决方案3】:

      试试这个:

      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 循环遍历所有键并将其分解为数组,其中键是名称和值子属性

      【讨论】:

      • 完美运行!!你能解释一下你的代码吗?谢谢
      • 顺便说一句,我还在努力理解 ES6 功能。这是我当前的工作代码:(不好?)
      • 在答案底部添加了评论,希望能澄清一下
      最近更新 更多