将数组映射到对象数组中,对于一个数组元素,我们可能有多个对象

时间:2017-12-01 17:17:32

标签: javascript arrays ecmascript-6

以最佳方式将对象数组和[[{a:1,b:2},{c:3,d:4}],{e:5}]数组转换为javascript中的[{a:1},{b:2},{c:3},{d:4},{e:5}]对象单个数组。 我使用spread运算符来展平数组,但是{...[{a:1,b:2}] }给了{0:{a:1},1:{b:2}}这是添加额外的键。然后我通过迭代所有元素来删除密钥。请帮助我找到最佳解决方案。

5 个答案:

答案 0 :(得分:1)

最短



var data = [[{a:1,b:2},{c:3,d:4}],{e:5}];
var result = [].concat(...data).reduce((ac,a) => 
		ac.concat(Object.keys(a).map( k=>({[k]:a[k]}) )) ,[]);
console.log(result);




答案 1 :(得分:1)

您可以使用copy-dependencies展平您的阵列。然后,使用array#reduce使用array#reduce获取单个键值对。



array#map




答案 2 :(得分:1)

使用Array#concatspread展平数组,通过传播到Object#assign,将entriesmap组合到单个对象申请表格:



var data = [[{a:1,b:2},{c:3,d:4}],{e:5}];

var getObject = (data) => {
  return data
  .reduce((r, b) =>  r.concat(b), [])
  .reduce((r,o) => r.concat(Object.keys(o).map(k => ({[k] : o[k]}))),[]);
}
console.log(getObject(data));




答案 3 :(得分:1)

您可以检查一个数组并采用递归方法来处理这种情况。如果没有映射具有单个属性的对象的条目。

var data = [[{ a: 1, b: 2 }, { c: 3, d: 4 }], { e: 5 }],
    result = data.reduce(function fn(r, a) {
        return r.concat(Array.isArray(a)
            ? a.reduce(fn, [])
            : Object.entries(a).map(([k, v]) => ({ [k]: v }))
        );
    }, []);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 4 :(得分:0)

这样的东西?



console.log([[{a:1,b:2},{c:3,d:4}],{e:5}].
reduce((arr, element) => Array.isArray(element) ? [...arr, ...element] : [...arr, element], []).
reduce((arr, element) => [...arr, ...Object.entries(element).map(([key, value]) => ({[key]: value}))], []));