在 TypeScript 中从数组累积映射

Vid*_*dya 2 javascript arrays json typescript ecmascript-6

我有一个 TypeScript 对象数组,其形状基本上如下:

interface MyObject {
  id: string
  position: number
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试将此数组转换为 id 映射,以使其位置与 JSON POST 类似:

{ 
   "id1": 1,
   "id2": 2,
}
Run Code Online (Sandbox Code Playgroud)

一种方法是使用 ES6 Map

array.reduce((map, obj) => map.set(obj.id, obj.position), new Map())

这可行,但是将 ES6 转换Map为 JSON 是有问题的。

我尝试将键值对累积成纯对象文字,但 TypeScript 一直讨厌我尝试的一切,其中包括可索引类型Object.create({})以及许多其他想法。

如何从对象数组中提取键值对的纯对象文字?

jca*_*alz 6

如果您的目标环境支持 ES2019,您可以使用Object.fromEntries(),如下所示:

function arrToObjES2019(arr: MyObject[]) {
  return Object.fromEntries(arr.map(({ id, position }) => [id, position]));
}
Run Code Online (Sandbox Code Playgroud)

Object.fromEntries()或者,如果没有,您可以在空对象上使用数组制作自己的类似polyfill的版本reduce(),如下所示:

function fromEntries<V>(iterable: Iterable<[string, V]>) {
  return [...iterable].reduce((obj, [key, val]) => {
    obj[key] = val
    return obj
  }, {} as {[k: string]: V})
}
Run Code Online (Sandbox Code Playgroud)

然后使用它:

function arrToObj(arr: MyObject[]) {
  return fromEntries(arr.map(({ id, position }) => [id, position]));
}
Run Code Online (Sandbox Code Playgroud)

无论哪种方式都应该让你做你想做的事:

const arr: MyObject[] = [
  { id: "id1", position: 1 },
  { id: "id2", position: 2 }
];

console.log(JSON.stringify(arrToObj(arr))); // {"id1":1,"id2":2}
Run Code Online (Sandbox Code Playgroud)

好的,希望有帮助。祝你好运!

链接到代码