我有一个 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 Types 、Object.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}
好的,希望对你有帮助。祝你好运!
关于javascript - 在 TypeScript 中从数组中累积映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57446821/