TS - 将对象数组缩减为一个对象

TS - Reduce an array of objects to an object

我想将对象数组转换为对象

var arrays = [
    {key:'k1',value:'v1'},
    {key:'k2',value:'v2'},
    {key:'k3',value:'v3'}
];

{k1: "v1", k2: "v2", k3: "v3"}

这个有效

const object: {[k: string]: any} = {};
arrays.forEach((item) => { object[item.key] = item.value });

但我想知道如何使用 reduce 来做到这一点。

const customData = arrays.reduce((obj, item) => (obj: Record<string, any>) => (obj[item.key] = item.value, obj), {});

returns

(obj) => (obj[item.key] = item.value) 

谢谢。

reduce 中的回调不应该是 return 一个函数,而是当前项目处理后的中间值——在你的例子中是你将当前项目分配给之后的对象它。

const customData = array.reduce((obj, item) => {
  obj[item.key] = item.value;
  return obj;
}, {} as Record<string, string>)

Playground link

您的代码的问题是 TypeScript 编译器无法推断 return 类型,而不是对象类型。因此,打字稿可以自行推断的单个对象不需要 Record<string, any> 。您需要传入您期望的结果类型。

你可以像这样简单地做,

var arrays = [
  { key:'k1',value:'v1' },
  { key:'k2',value:'v2' },
  { key:'k3',value:'v3' }
];

const result = arrays.reduce((prev: {[key: string]: string}, curr) => {
   prev[curr.key] = curr.value;
   return prev;
}, {});

console.log(result);

注意:添加结果类型是为了让打字稿确定结果类型。

而且,你可以用 shorthand 语法来写,

const result = arrays.reduce((prev: {[key: string]: string}, curr) =>  
  ({ ...prev, [curr.key]: curr.value}), {})