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

fra*_*al5 5 reduce typescript

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

var arrays = [
    {key:'k1',value:'v1'},
    {key:'k2',value:'v2'},
    {key:'k3',value:'v3'}
];
Run Code Online (Sandbox Code Playgroud)

到

{k1: "v1", k2: "v2", k3: "v3"}
Run Code Online (Sandbox Code Playgroud)

这有效

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

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

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

回报

(obj) => (obj[item.key] = item.value) 
Run Code Online (Sandbox Code Playgroud)

谢谢。

Voj*_*nad 9

内部的回调reduce不应返回函数,而是返回处理当前项目后的中间值 \xe2\x80\x93 在您的情况下,将当前项目分配给它后的对象。

\n
const customData = array.reduce((obj, item) => {\n  obj[item.key] = item.value;\n  return obj;\n}, {} as Record<string, string>)\n
Run Code Online (Sandbox Code Playgroud)\n

游乐场链接

\n


San*_*eep 6

您的代码的问题是 TypeScript 编译器无法推断返回类型,而不是对象类型。因此,您不需要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);
Run Code Online (Sandbox Code Playgroud)

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

而且,您可以使用简写语法来编写,

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