使用for循环无法将二维数组元素复制到另一个数组?这段JavaScript代码存在什么问题?
问题分析与解决
这个错误的根源很明确:你初始化的arr是一个空数组,当尝试给arr[i][j]赋值时,arr[i]还没有被定义为数组——它是undefined,自然没法给undefined的子属性(也就是子数组的元素)赋值。
为什么一维数组没问题?
处理一维数组时,你是直接给arr[i]赋值单个值(比如arr[i] = someValue),这时候JavaScript会自动扩展数组长度并完成赋值。但二维数组不一样,arr[i]本身得是一个数组,你才能往它里面塞arr[i][j]这类元素。
修正后的for循环代码
你只需要在外层循环里,先给当前行的arr[i]初始化一个空数组,再进行内层循环赋值:
let matrix1 = [ [2, 7, 9, 2], [8, 0, 7, 1], [8, 8, 0, 8] ]; let arr = []; for (let i = 0; i < matrix1.length; i++) { arr[i] = []; // 关键步骤:先创建当前行的子数组 for (let j = 0; j < matrix1[i].length; j++) { arr[i][j] = matrix1[i][j]; } } console.log(arr);
额外优化:更简洁的复制方式
如果不想写嵌套循环,也可以直接复制每一行的数组(比如用扩展运算符或者slice()),效果完全一致:
let matrix1 = [ [2, 7, 9, 2], [8, 0, 7, 1], [8, 8, 0, 8] ]; let arr = []; for (let i = 0; i < matrix1.length; i++) { arr[i] = [...matrix1[i]]; // 或者 matrix1[i].slice() } console.log(arr);
为什么arr = [[]]也不行?
你注释里提到的arr = [[]]只初始化了第一行的空数组,当循环到i=1时,arr[1]还是undefined,同样会触发相同的错误。必须保证每一行的子数组都被单独初始化。
内容的提问来源于stack exchange,提问作者M P
相关产品推荐
相关产品推荐

