代码之家  ›  专栏  ›  技术社区  ›  swyx

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

  •  2
  • swyx  · 技术社区  · 5 年前

    在javascript中,将一个对象数组转换为一个数组对象是一个常见的问题,但是在Typescript中如何在完全支持键入的情况下实现这一点呢?

    2 回复  |  直到 5 年前
        1
  •  3
  •   Sebastian    5 年前
    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>)
    }
    

    如果这在运行时不起作用,请提供示例输入和输出。如果这还不够“类型支持”,请添加编译时应拒绝和接受的示例。

        2
  •  2
  •   swyx    5 年前

    像这样做

    **
     * 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
    }