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

如何将二维数组arr1的列元素转存到arr2?解决push报错问题

二维数组转置实现及报错解决

需求描述

现有二维数组arr1:

const arr1 = [
  ['    ', '[H] ', '    '],
  ['[W] ', '[B] ', '    '],
  ['[S] ', '    ', '[M]']
];

需要将其转置:把每个子数组的索引0元素收集到arr2[0],索引1元素收集到arr2[1],最终得到目标数组arr2:

const arr2 = [
  ['    ', '[W] ', '[S] '],
  ['[H] ', '[B] ', '    '],
  ['    ', '    ', '[M]']
];

报错原因分析

你写的代码出现TypeError: Cannot read properties of undefined (reading 'push'),核心问题有两个:

  1. arr2初始是空数组,arr2[i]在未初始化时是undefined,直接调用push自然报错;
  2. 循环逻辑完全搞反:内层遍历的是子数组的元素而非列索引,根本没法正确收集对应位置的元素。

正确实现方案

方案一:嵌套循环(手动初始化子数组)

先根据原数组的列数初始化arr2的子数组,再按列->行的顺序遍历赋值:

const arr1 = [
  ['    ', '[H] ', '    '],
  ['[W] ', '[B] ', '    '],
  ['[S] ', '    ', '[M]']
];

const arr2 = [];
// 先初始化arr2的每个子数组(原数组有多少列,arr2就有多少个子数组)
for (let col = 0; col < arr1[0].length; col++) {
  arr2[col] = [];
}

// 遍历原数组的每一行
for (let row = 0; row < arr1.length; row++) {
  // 遍历当前行的每一列
  for (let col = 0; col < arr1[row].length; col++) {
    // 把原数组[row][col]放到arr2[col]的末尾
    arr2[col].push(arr1[row][col]);
  }
}

console.log(arr2); // 得到目标数组

方案二:用数组方法简化(更简洁)

利用map方法一行实现转置,逻辑更清晰:

const arr1 = [
  ['    ', '[H] ', '    '],
  ['[W] ', '[B] ', '    '],
  ['[S] ', '    ', '[M]']
];

// 遍历原数组的列,每一列对应arr2的一行
const arr2 = arr1[0].map((_, colIndex) => {
  // 收集每一行的第colIndex个元素
  return arr1.map(row => row[colIndex]);
});

console.log(arr2); // 得到目标数组

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 03:15:40