【问题标题】:What is the best way to "merge" 2 arrays by each value?按每个值“合并”2个数组的最佳方法是什么?
【发布时间】:2021-09-06 13:25:20
【问题描述】:

假设我有任意数量的长度相同的数组。我想将它们合并到另一个数组中。

我所说的合并是指将数组的每个值合并到输出数组中。

我可以得到一个可以做到这一点的函数merge(...arrays)吗?

类型定义(可能有误):<T extends Array<U>, U>(...arr: T[]) => [...T][]

merge([A, B], [C, D]) → [[A, C], [B, D]]

例子:

  • merge([1, 2, 3], [10, 20, 30]) → [[1, 10], [2, 20], [3, 30]]
  • merge([1, 2, 3]) → [[1], [2], [3]]
  • merge([1, "", {}], [17, { a: 1 }, "a"]) → [[1, 17], ["", { a: 1 }], [{}, "a"]]
  • merge([]) → []

编辑:另外,请为函数提供 TypeScript 类型定义。

【问题讨论】:

    标签: javascript arrays typescript multidimensional-array


    【解决方案1】:

    您无法使用 TypeScript 确定数组元素的类型。如果数组元素是已知类型,您可以在函数中使用类型参数来帮助您在返回结果时获取类型。但是 TypeScript 永远无法确定数组的元素是否是具有某些属性的对象。

    @iota 的建议很棒。 Array.map() 是最好的。我只添加了一个检查,如果数组大小不同,则会引发错误。

    
    function merge<U>(...arrs: Array<Array<U>>): U[][] {
        const { length: firstLength } = arrs[0];
        if (!arrs.every((arr) => arr.length == firstLength)) {
            throw new Error('Arrays are not the same size.');
        }
        return arrs[0].map((_, i)=>arrs.map(x => x[i]));
    }
    // arrays are arbritrary in type
    // inform `any` as type parameter
    const a = merge<any>([1, "", {}], [17, { a: 1 }, "a"]);
    // a is any[][]
    
    // arrays are made of numbers
    // tell typescript that 
    const b = merge<number>([1, 2, 3], [10, 20, 30]))
    // b is number[][]
    
    // try hacking that...
    const c = merge<number>([1, "", {}], [17, { a: 1 }, "a"]))
    // ts error Type 'string' is not assignable to type 'number'.
    //          Type '{}' is not assignable to type 'number'.
    

    【讨论】:

    • 这也可以,但我能够将类型简化为&lt;T&gt;(...arrs: T[][]): T[][],因为Array&lt;T&gt; 和T[] 在语法上是等价的。
    • 是的,这是有效的语法
    【解决方案2】:

    您可以使用Array#map。

    function merge(...arrs){
      return arrs[0].map((_, i)=>arrs.map(x => x[i]));
    }
    console.log(JSON.stringify(merge([1, 2, 3], [10, 20, 30])));
    console.log(JSON.stringify(merge([1, 2, 3])));
    console.log(JSON.stringify(merge([1, "", {}], [17, { a: 1 }, "a"])));

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-13
      • 2016-10-07
      • 2023-03-03
      • 2022-11-15
      相关资源
      最近更新 更多