如何用更简洁代码实现_lodash.zip功能?
嘿,我懂你想要把这个zip函数写得更简洁优雅的心情——原代码的嵌套循环确实有点冗余,不够直观。这里有几种更简洁的实现方式,完全复刻lodash.zip的功能,还能保持代码的可读性:
方案一:用Array.from实现(推荐)
这种方式利用Array.from的第二个映射参数,把原代码的三层循环浓缩成更声明式的写法:
const zip = (...arrays) => Array.from( { length: Math.max(...arrays.map(arr => arr.length)) }, (_, index) => arrays.map(array => array[index]) );
原理说明:
- 先通过
Math.max(...arrays.map(arr => arr.length))计算出所有输入数组的最大长度,作为结果数组的长度。 Array.from会根据这个长度创建一个新数组,每个位置的元素通过映射函数生成:遍历所有输入数组,取出对应索引的元素,组成子数组。- 当某个数组的长度不足时,
array[index]自然会返回undefined,完美符合测试用例的要求。
方案二:结合Array.prototype.map与扩展运算符
如果想换一种写法,也可以先找到最长的输入数组,再基于它的索引来生成结果:
const zip = (...arrays) => { const maxLength = Math.max(...arrays.map(arr => arr.length)); // 创建一个长度为maxLength的临时数组,用来遍历索引 return Array(maxLength).fill().map((_, index) => arrays.map(array => array[index]) ); };
这种写法和方案一逻辑类似,只是用Array(maxLength).fill()来生成遍历用的数组,效果完全一致。
验证测试用例
这两种实现都能通过你给出的所有测试用例:
- 测试1:
zip([1, 2], [4, 5], [9, 1])→[[1, 4, 9], [2, 5, 1]] - 测试2:
zip([1, 2, 3], [4, 5, 6])→[[1, 4], [2, 5], [3, 6]] - 测试3:
zip([1, 2], [], [3, 4, 5])→[[1, undefined, 3], [2, undefined, 4], [undefined, undefined, 5]]
相比原实现,这两种写法去掉了冗余的临时变量和嵌套循环,代码更紧凑,逻辑也更清晰。
内容的提问来源于stack exchange,提问作者Vic
相关产品推荐
相关产品推荐

