javascript - 在 TypeScript 中从数组中累积映射

标签 javascript arrays json typescript ecmascript-6

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

interface MyObject {
  id: string
  position: number
}

我正在尝试将这个数组转换成一个 id 映射到一个 JSON POST 的位置:

{ 
   "id1": 1,
   "id2": 2,
}

一种方法是使用 ES6 Map:

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

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

我曾尝试将键值对累积到一个纯对象字面量中,但 TypeScript 一直讨厌我尝试的所有方法,其中包括 Indexable TypesObject.create({}) 以及许多其他想法。

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

最佳答案

如果你的目标环境支持 ES2019,你可以使用 Object.fromEntries() ,像这样:

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

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

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

然后使用它:

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

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

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

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

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

Link to code

关于javascript - 在 TypeScript 中从数组中累积映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57446821/

相关文章:

c - 为什么 "1"存储在所有数组索引位置?

json - 无法加载 JSON 数据以在 ListView 中显示

javascript - JQuery:json 到对象?

javascript - Creative SDK Image Editor UI 不显示自定义、可调整大小的文本(网络)

javascript - 如何在 JavaScript 中实现 GROWTH 函数

php - 如何将变量(即 url)提取到 iframe src 中?

java - 这些不同类型的数组减速到底是如何工作的?

javascript - 如何在 console.log() 上显示的表中获取值?

json - 如何使用 twit 通过媒体 POST 请求执行更新?

javascript - 使用 JavaScript 检测 NPAPI 支持