将(非嵌套)对象的数组转换为具有完整键入的数组的对象

时间:2019-01-02 12:26:41

标签: typescript

在javascript中将对象数组隐式转换为数组对象是一个常见问题,但是如何在具有完全键入支持的Typescript中实现呢?

2 个答案:

答案 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
}

很高兴看到更好的想法