我正在尝试将以下对象数组转换为包含label属性的对象,作为包含与该属性相同的键的多个对象数组的键。
这是一个映射数组的函数的JSBin,但我不确定我将使用的ES6逻辑来获得我想要的输出。
https://jsbin.com/foyijisaku/1/edit?js,console
原始数组
var originalArray =
[
{
'id': 6,
'label': 'hello'
},
{
'id': 5,
'label': 'hello'
},
{
'id': 4,
'label': 'bye'
},
{
'id': 3,
'label': 'bye'
},
{
'id': 2,
'label': 'bye'
},
{
'id': 1,
'label': 'bye'
}
]
新对象
var newObject =
{
'hello': [
{
'id': 6,
'label': 'hello'
},
{
'id': 5,
'label': 'hello'
},
],
'bye': [
{
'id': 4,
'label': 'bye'
},
{
'id': 3,
'label': 'bye'
},
{
'id': 2,
'label': 'bye'
},
{
'id': 1,
'label': 'bye'
},
]
}
答案 0 :(得分:2)
var originalArray =
[
{
'id': 6,
'label': 'hello'
},
{
'id': 5,
'label': 'hello'
},
{
'id': 4,
'label': 'bye'
},
{
'id': 3,
'label': 'bye'
},
{
'id': 2,
'label': 'bye'
},
{
'id': 1,
'label': 'bye'
}
]
var newObject = originalArray.reduce(function(accumulator, current) {
accumulator[current.label] = accumulator[current.label] || [];
accumulator[current.label].push({
id: current.id,
label: current.label
});
return accumulator;
}, {})
在ES6中,使用点差运算符:
var newObject = originalArray.reduce((accumulator, current) => {
accumulator[current.label] = accumulator[current.label] || [];
accumulator[current.label].push({...current});
return accumulator;
}, {})
不直接推动电流的原因是为了避免保持参考。
答案 1 :(得分:0)
您需要迭代整个数组。您可以使用for...in
循环执行此操作。
var newObject;
for(var o in originalArray){
if(o.label == 'hello'){
var len = object['hello'].length;
object['hello'][len] = o;
}else{
var len = object['bye'].length;
object['bye'][len] = o;
}
}