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

unzip函数返回值出现0的原因及矩阵转置内层循环实现疑问

解答:矩阵转置(unzip函数实现)

问题1:返回值中的0来源分析

你预填充结果数组时,给每个子数组初始化为[0, 0],但后续循环逻辑只覆盖了部分位置。以unzip([[1,2],[3,4]])为例:

  • results[1][0]这个位置在你的循环里从未被赋值,所以保留了初始的0值,这就是错误输出中0的来源。

你的循环逻辑仅处理了对角线(results[i][i])和右上三角区域(j > i的情况),遗漏了左下三角区域(比如results[1][0]),导致这些位置的初始0未被替换。

问题2:正确的内层循环实现逻辑

这个需求本质是矩阵转置:结果数组的第i行第j列元素,等于原数组的第j行第i列元素。

基础实现(双重循环)

function unzip(arr) {
  // 原数组的行数
  const originalRows = arr.length;
  // 原数组的列数(假设所有子数组长度一致)
  const originalCols = arr[0].length;
  const result = [];

  // 遍历原数组的每一列,作为结果的每一行
  for (let i = 0; i < originalCols; i++) {
    // 初始化结果的当前行
    result[i] = [];
    // 遍历原数组的每一行,填充结果的当前行
    for (let j = 0; j < originalRows; j++) {
      result[i][j] = arr[j][i];
    }
  }

  return result;
}

测试验证:

console.log(unzip([[1,2],[3,4]])); // [[1,3],[2,4]]
console.log(unzip([[1,2,3],[4,5,6]])); // [[1,4],[2,5],[3,6]]
console.log(unzip([["a"],["b"],["c"]])); // [['a','b','c']]

简洁实现(使用数组方法)

如果想用更简洁的写法,可以结合Array.prototype.map:

function unzip(arr) {
  // 以原数组的第一行为基准,遍历每一列索引
  return arr[0].map((_, colIndex) => {
    // 遍历原数组的每一行,取出对应列的元素
    return arr.map(row => row[colIndex]);
  });
}

这种写法更直观:外层map遍历原数组的列索引,内层map遍历原数组的每一行,收集当前列的所有元素组成结果的一行。


内容的提问来源于stack exchange,提问作者user12758446

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 14:01:05