TypeScript中是否存在支持多数组输入的类似map()的multiMap函数?
在TypeScript中实现多数组映射的方案
嘿,你说的这个多数组映射的需求确实很常见!TypeScript本身并没有内置名为multiMap的函数,但咱们完全可以通过原生API组合,或者自己封装一个工具函数来实现你想要的效果,甚至能比你预想的更灵活。
方案一:利用原生map结合索引(最简单的原生实现)
如果你的输入数组长度一致,直接用第一个数组的map方法,通过索引去获取其他数组对应位置的元素就可以了:
const arr1 = [0, 1, 2]; const arr2 = [2, 4, 6]; const result = arr1.map((item1, index) => item1 + arr2[index]); console.log(result); // 输出: [2, 5, 8]
要是数组长度不一致,咱们可以先取所有数组里的最短长度,避免索引越界:
const arr1 = [0, 1, 2, 3]; const arr2 = [2, 4, 6]; const minLength = Math.min(arr1.length, arr2.length); const result = arr1.slice(0, minLength).map((item1, index) => item1 + arr2[index]); console.log(result); // 输出: [2, 5, 8]
方案二:封装自己的multiMap工具函数
如果需要频繁用到这个功能,不如封装一个通用的multiMap函数,支持任意数量的输入数组:
function multiMap<T extends any[], R>(arrays: T[], callback: (...args: T[number]) => R): R[] { // 处理空输入的情况 if (arrays.length === 0) return []; // 取所有数组中最短的长度,避免越界 const minLength = Math.min(...arrays.map(arr => arr.length)); // 遍历每个索引,收集对应元素并传入回调 return Array.from({ length: minLength }, (_, index) => { const currentItems = arrays.map(arr => arr[index]); return callback(...currentItems as Parameters<typeof callback>); }); } // 使用示例 const arr1 = [0, 1, 2]; const arr2 = [2, 4, 6]; const result = multiMap([arr1, arr2], (item1, item2) => item1 + item2); console.log(result); // 输出: [2, 5, 8] // 支持更多数组的情况 const arr3 = [1, 1, 1]; const result2 = multiMap([arr1, arr2, arr3], (a, b, c) => a + b + c); console.log(result2); // 输出: [3, 6, 9]
这个函数还做了TypeScript的类型适配,能自动推断回调参数的类型,用起来更安全。
额外提一句:工具库的现成方案
如果你不想自己写代码,像lodash这样的工具库提供了zipWith函数,完全符合你的需求——它会把多个数组按位置“拉链”合并,再传入回调处理:
import { zipWith } from 'lodash'; const arr1 = [0, 1, 2]; const arr2 = [2, 4, 6]; const result = zipWith(arr1, arr2, (a, b) => a + b); console.log(result); // 输出: [2, 5, 8]
不过如果只是简单场景,原生方案完全足够,没必要引入额外依赖~
内容的提问来源于stack exchange,提问作者Niels Ferguson
相关产品推荐
相关产品推荐

