一行,用于在关联数组中动态创建键,或者(如果存在)将值推送到现有键的数组



采用此数据结构:

data = [
{
group: '4',
data: [
{
type: 'Type 1',
value: 1
},
{
type: 'Type 2',
value: 2
}
]
},
{
group: '5',
data: [
{
type: 'Type 1',
value: 3
},
{
type: 'Type 2',
value: 5
}
]
}
];

我想创建一个关联数组,看起来像:

{
'Type 1': [1, 3],
'Type 2': [2, 5]
}

我目前的解决方案:

const arr = data.reduce((acc, p) => {
const updatedAcc = acc;
p.data.forEach(d => {
if (updatedAcc[d.type] === undefined) {
updatedAcc[d.type] = [d.value];
} else {
updatedAcc[d.type].push(d.value);
}
});
return updatedAcc;
}, {});

如何在一行中或使用隐式返回来实现这一点,同时保持处理任意数量的不同"类型"(即data.type属性的不同字符串(的能力?

略微修改了@Olian04的版本,以简化第二次reduce。

const data = [{
group: '4',
data: [{
type: 'Type 1',
value: 1
}, {
type: 'Type 2',
value: 2
}
]
}, {
group: '5',
data: [{
type: 'Type 1',
value: 3
}, {
type: 'Type 2',
value: 5
}
]
}
];
const out = data
.reduce((res, v) => ([...res, ...v.data]), []) // Flatten data
.reduce((res, v) => (res[v.type] = res[v.type] || []).push(v.value)&&res, {});
console.log(out);

我会首先将数据扁平化为单个数组(第一个reduce(,然后根据该数组构造新的数据格式(第二个reduce(。

const data = [{
group: '4',
data: [{
type: 'Type 1',
value: 1
}, {
type: 'Type 2',
value: 2
}
]
}, {
group: '5',
data: [{
type: 'Type 1',
value: 3
}, {
type: 'Type 2',
value: 5
}
]
}
];
const out = data
.reduce((res, v) => ([...res, ...v.data]), []) // Flatten data
.reduce((res, v) => { // Convert to new format
if (v.type in res) {
res[v.type].push(v.value);
} else {
res[v.type] = [v.value];
}
return res;
}, {});
console.log(out);

我应该补充一点,这不会删除重复的"值",所以如果需要,您必须自己添加该逻辑。

可读性较差但更紧凑的版本:

const data = [{
group: '4',
data: [{
type: 'Type 1',
value: 1
}, {
type: 'Type 2',
value: 2
}
]
}, {
group: '5',
data: [{
type: 'Type 1',
value: 3
}, {
type: 'Type 2',
value: 5
}
]
}
];
const out = data
.reduce((res, v) => ([...res, ...v.data]), [])
.reduce((res, v) => 
v.type in res ? {...res, [v.type]: [...res[v.type], v.value]} : {...res, [v.type]: [v.value]}, 
{});
console.log(out);

如果您想在单行中进行赋值,可以使用三元运算符

const arr = data.reduce((acc,p)=>{
const updatedAcc = acc;
p.data.forEach(d=>{
updatedAcc[d.type] = (d.type in updatedAcc) ? updatedAcc[d.type].concat([d.value]) : [d.value];
});
return updatedAcc;
}
, {});

最新更新