在javascript中将对象数组隐式转换为数组对象是一个常见问题,但是如何在具有完全键入支持的Typescript中实现呢?
答案 0 :(得分:3)
type Pivot<T> = {
[K in keyof T]: T[K][];
}
function pivot<T extends Record<any, any>>(items: T[]): Pivot<T> {
return Object.keys(items[0]).reduce((obj, key) => {
obj[key] = items.map(item => item[key])
return obj
}, {} as Pivot<T>)
}
如果这在运行时不起作用,请提供示例输入和输出。如果这还不足以提供“类型支持”,请添加示例,这些示例应在编译时予以拒绝和接受。
答案 1 :(得分:2)
像这样
**
* convert an array of (non nested) objects to an object of arrays.
* assumes all objects are the same shape
* */
type IndexObject = { [index: string]: any }; // hacky. :(
function pivot<T>(arr: (T & IndexObject)[]) {
type Subset = { [K in keyof T]?: T[K] }; // make it optional to build the return array
let ans: IndexObject & Subset = {};
Object.keys(arr[0]).forEach(k => {
ans[k] = arr.map(obj => obj[k]);
});
return ans as { [K in keyof T]: T[K] }; // take out the optionality of every key
}
很高兴看到更好的想法