我在以下结构中获取数据:
[{type: 'banana', value: 1}, {type: 'apple', value: 1}, {type: 'banana', value: 4}]
我想按如下所示的类型“组合”数据:
[{type: 'banana', value: [1, 4]}, {type: 'apple', value: [1]}]
我在这里采用的一般方法是将您的输入转换为一个对象,该对象的键是
type
属性,其值是相应 value
属性的数组。这是一个迭代的方法:
const input = [
{ type: 'banana', value: 1 },
{ type: 'apple', value: 1 },
{ type: 'banana', value: 4 }
];
const acc: Record<string, number[]> = {}
for (const el of input) {
if (!(el.type in acc)) // the first time you see this type
acc[el.type] = []; // initialize the array
acc[el.type].push(el.value);
};
Object.entries()
方法迭代这个对象的条目,对值数组进行排序,并构建你的输出:
const output = [];
for (const [type, value] of Object.entries(acc)) {
value.sort((a, b) => a - b); // numeric sort
output.push({ type, value });
}
产生所需的输出:
console.log(output);
/*
[{
"type": "banana",
"value": [ 1, 4 ]
}, {
"type": "apple",
"value": [ 1 ]
}]
*/
您可以重构为使用函数式数组方法而不是
for
循环:
const output = Object.entries(input
.reduce<Record<string, number[]>>(
(acc, el) => ((acc[el.type] ??= []).push(el.value), acc), {}
)).map(
([type, value]) => ({ type, value: value.sort((a, b) => a - b) })
);
本质上是相同的算法(并且仍然是命令式的,改变
acc
和acc[el.type]
)。