按键排序/减少对象

问题描述 投票:0回答:1

我在以下结构中获取数据:

[{type: 'banana', value: 1}, {type: 'apple', value: 1}, {type: 'banana', value: 4}]

我想按如下所示的类型“组合”数据:

[{type: 'banana', value: [1, 4]}, {type: 'apple', value: [1]}]
typescript sorting reduce
1个回答
0
投票

我在这里采用的一般方法是将您的输入转换为一个对象,该对象的键是

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]
)。

游乐场代码链接

© www.soinside.com 2019 - 2024. All rights reserved.