在javascript中展平对象数组

时间:2018-01-30 15:34:19

标签: javascript jquery data-structures flatten

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

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/ 但它没有做任何事情,我可以做任何其他方式吗?

由于

2 个答案:

答案 0 :(得分:2)

递归方式是:

 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)获得所需的结果。

答案 1 :(得分:0)

您可以使用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))