You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用更简洁代码实现_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])
  );

原理说明:

  1. 先通过Math.max(...arrays.map(arr => arr.length))计算出所有输入数组的最大长度,作为结果数组的长度。
  2. Array.from会根据这个长度创建一个新数组,每个位置的元素通过映射函数生成:遍历所有输入数组,取出对应索引的元素,组成子数组。
  3. 当某个数组的长度不足时,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:19:40