【问题标题】:flatten an array of objects in javascript在javascript中展平一组对象
【发布时间】:2018-07-09 13:20:33
【问题描述】:

我有一个看起来像这样的数据结构

const array = [{
    name: 'bar',
  children: [{
    name: 'foo',
    children: [{
        name: 'baz123',
    }, {
        name: 'baz',
    }]
  }]
}, {
    name: 'shallowKey'
}, {
    name: 'abc'
}];

我想把它弄平,看起来像这样

[{
    name: 'bar'
}, {
    name: 'foo',
}, {
    name: 'baz123',
}, {
    name: 'baz',
}, {
    name: 'shallowKey'
}, {
    name: 'abc'
}];

我试过这样的 lodash https://jsfiddle.net/hmzhjji/081q60qg/1/ 但它什么也没做,我还能用其他方法吗?

谢谢

【问题讨论】:

  • 那个小提琴不用lodash
  • 我目前正试图在同一个小提琴中想出一些东西,对不起
  • 我假设这里的任何对象都可以有孩子,也可以有孩子,也可以有孩子,等等?

标签: javascript jquery data-structures flatten


【解决方案1】:

递归方式是:

 function flatten(array, result = []){
   for(const {name, children} of array){
     result.push({name});
     if(children) flatten(children, result);
   }
  return result;
}

或者替代的 ES6 版本:

 const flatten = array => array.reduce((res, {name, children = []}) => res.concat(name).concat(flatten(children)), []);

所以你可以通过flatten(array) 得到想要的结果。

【讨论】:

  • @federico 你认为解释对这里有帮助吗? this iterates over the array, destructures each element and pushes its name into the result, the proceed with its children
  • @darshan 我为什么要这样做??
  • @JonasW。你知道吗?你是对的,我很抱歉。但我收回反对票为时已晚(除非你编辑你的帖子)。
  • @JonasW。个人而言,因为很多问题都是业力,而不是试图对 OP 有所帮助。情况并非如此,但某些答案的普遍性让我很高兴。不知道别人怎么想的。
  • 对不起,我错过了什么吗?代码并不复杂,需要文档。解释一些简单的代码可能会很痛苦,特别是如果你只是在帮助别人
【解决方案2】:

您可以使用 forEach 遍历数组并检查所需对象是否存在并递归调用函数

const array = [{
    name: 'bar',
  children: [{
    name: 'foo',
    children: [{
        name: 'baz123',
    }, {
        name: 'baz',
    }]
  }]
}, {
    name: 'shallowKey'
}, {
    name: 'abc'
}];


var res = [];
function flatten(array){
   array.forEach(function(obj){
       var name = {name: obj.name}
       res.push(name);
       if(obj.children){
          flatten(obj.children)
        }
    })
    return res;
 }


 console.log(flatten(array))

【讨论】:

    猜你喜欢
    • 2018-02-24
    • 2015-05-23
    • 2023-01-11
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2020-07-19
    • 2019-07-20
    • 1970-01-01
    相关资源
    最近更新 更多