【问题标题】:Turn flat array into nested array using javascript使用javascript将平面数组转换为嵌套数组
【发布时间】:2018-05-02 15:34:44
【问题描述】:

我希望将此平面数组转换为嵌套数组,但它一直返回为空。不知道如何解决这个问题或我错过了什么,但这让我发疯。

平面数组:

var names =[
{ name: 'b', parent: 'Brown' },
{ name: 'a', parent: 'Brown' },
{ name: 'h', parent: 'Green' },
{ name: 'c', parent: 'Green' },
];

想要的数组输出:

[{
    name: 'Brown',
    children: [{
            name: 'a',
            children: []
        },
        {
            name: 'b',
            children: []
        }
    ]
}, {
    name: 'Green',
        children: [{
                name: 'h',
                children: []
            },
            {
                name: 'c',
                children: []
            }
        ]
    }
}]

Js:

function getNestedChildren(arr, parent) {
    var children = [];
    for(var i =0; i < arr.length; ++i) {
        if(arr[i].parent == parent) {
            var grandChildren = getNestedChildren(arr, arr[i].name)

            if(grandChildren.length) {
                arr[i].children = grandChildren;
            }
            children.push( arr[i]);
        }
    }
    return children;
}
var nest = getNestedChildren(names, names.parent);
console.log( nest);

【问题讨论】:

  • var nest = getNestedChildren(names, names.parent); names.parent 是什么? undefined?
  • 您必须遍历名称并为每个名称调用父名称[0].parent(否则它未定义)
  • 我正在尝试进入数组的根级别。有什么想法吗?
  • @user992731 使用 0 获取根级别。请参阅下面的答案
  • 另外,这对您来说可能很有趣:how-to-group-an-array-of-objects-by-key(先复制错误链接,已编辑)

标签: javascript arrays multidimensional-array nested


【解决方案1】:

var names =[
{ name: 'b', parent: 'Brown' },
{ name: 'a', parent: 'Brown' },
{ name: 'h', parent: 'Green' },
{ name: 'c', parent: 'Green' },
{ name: 'j', parent: 'Brown' }
];

function groupBy(arr, f) {
  return arr.reduce((r, v, i, a, k = f(v)) => ((r[k] || (r[k] = [])).push(v), r), {});
}

function nestArray(array){
  var newArray=[],
      resultGrouped = groupBy(names, function(c) {
    return c.parent
  });
  
  for (var key in resultGrouped){
    var item=resultGrouped[key];
    
    newArray.push({
      name:key,
      children:item.map(function(map){
        delete map.parent;
        map.children=[];
        return map;
      })
    });
  }
  
  return newArray;
}
console.log(nestArray(names));

【讨论】:

    【解决方案2】:

    您可以创建一个新对象,为每个项目分配一个数组给具有父名称的键,并将项目连接到该数组

    var names =[
    { name: 'b', parent: 'Brown' },
    { name: 'a', parent: 'Brown' },
    { name: 'h', parent: 'Green' },
    { name: 'c', parent: 'Green' },
    ];
    
    const getGroup=(groups, parent) => {
      let group = groups.find(g=>g.parent===parent);
      if(!group){
        group=({parent,children:[]});
        groups.push(group);
      }
      return group;
    }
    
    let  grouped = []
     names.forEach(item=> getGroup(grouped,item.parent).children.push(item))
     
                                 
    console.log(grouped)

    【讨论】:

    • 您的结果看起来不像 OP 的预期结果。
    【解决方案3】:

    因此,对于初学者,您需要遍历名称并将每个父级发送到您的 getNestedChildren() 函数。

    var names =[
        { name: 'b', parent: 'Brown' },
        { name: 'a', parent: 'Brown' },
        { name: 'h', parent: 'Green' },
        { name: 'c', parent: 'Green' },
    ];
    
    var nest = [];
    
    for (var i = 0; i < names.length; i++) {
        nest.push(getNestedChildren(names, names[i].parent));
    } 
    

    此外,您的 getNestedChildren() 当前正在尝试修改并发送回旧名称数组。我建议改为创建一个新对象,然后将带有孩子的对象发回。

    function getNestedChildren(arr, parent) {
        var children = [];
        var parentObj = {};
        parentObj.name = parent;
        for(var i =0; i < arr.length; ++i) {
            if(arr[i].parent == parent) {
                children.push(getNestedChildren(arr, arr[i].name));
            }
        }
        parentObj.children = children;
        return parentObj;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-11
      • 1970-01-01
      • 1970-01-01
      • 2022-11-29
      相关资源
      最近更新 更多