如何在JavaScript中填充多维数组?

8

我尝试让这个工作,但外部循环在第二次迭代后停止,之后的所有内容都不会执行(就像脚本结束一样)。我想用任何字符(这里我使用了'q'作为示例)填充二维数组。

var A=[[],[]];
for(var i=0;i<12;i++){
    for(var j=0;j<81;j++){
        A[i][j]='q';
    }
}

这段代码没有起作用,所以我加了alert(i+' '+j);来检查是否有执行,但是像之前写的一样,在外层循环的第二次迭代后停止,并且忽略脚本的其余部分。

我的目标是在给定的范围内(在这种情况下是12行,81列)用相同字符填充此数组,因此如果这种方法行不通,我会很高兴看到一个可行的方法。


你只用2个项初始化A。在询问为什么事情不起作用之前,请始终检查您的控制台中是否有错误。Uncaught TypeError: Cannot set property '0' of undefined 在外部循环中创建一个数组以分配给[i] - CertainPerformance
1
一种整洁的方式是这样的: const A = Array(12).fill(0).map(() => Array(81).fill("q")); - Countingstuff
可能是 JavaScript 中声明和填充多维数组的高效方法 的重复问题。 - Heretic Monkey
7个回答

9
Array.from()方法可以从类数组或可迭代对象创建一个新的浅拷贝的数组实例。

function createAndFillTwoDArray({
  rows,
  columns,
  defaultValue
}){
  return Array.from({ length:rows }, () => (
      Array.from({ length:columns }, ()=> defaultValue)
   ))
}

console.log(createAndFillTwoDArray({rows:3, columns:9, defaultValue: 'q'}))


8

这一行代码可以完成任务。

var A = Array(12).fill(null).map(()=>Array(81).fill('q'))

这是一个包含引用的数组,正如harunurhan所评论的那样,这是一个糟糕的想法。

var A = Array(12).fill(Array(81).fill('q'));


12
在这种情况下,数组A的所有元素将指向同一个数组引用,因此修改A[i][j]也会修改A[0...11][j]。 - harunurhan
在这里很好地解释了 https://medium.com/@wisecobbler/4-ways-to-populate-an-array-in-javascript-836952aea79f - Keith Thomas

6

var A = new Array(2);

^ 这行代码声明了一个大小为1x2的二维数组。尝试使用这个代码替代它:

var A = [];
for (var i = 0; i < 12; i++) {
    A[i] = [];
    for (var j = 0; j < 81; j++) {
        A[i][j] = 'q';
    }
}

@MarkMeyer 我在重新格式化代码以使堆栈溢出表单验证多行代码时,忘记了第三行的 A[i] = []; :) 很好的发现! - johnheroy
听起来相当慢,有更快的方法吗? - seddouguim

2

由于fill()最简洁直观,且对于不可变值的工作方式符合预期,因此我的首选是一个外部的from()和一个内部的fill():

Array.from({length: 12}, _ => new Array(81).fill('q'));

2
最好的填充二维数组的方法如下:
let array2D = [], row = 3, col = 3, fillValue = 1
for (let i = 0; i < row; i++){
  let temp = []
  for (let j = 0; j < col; j++){
   temp[j] = fillValue
  }
  array2D.push(temp)
}

1
简单的方式

Array(10).fill(Array(10).fill(0))


你的回答可以通过提供更多支持性信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人能够确认你的回答是否正确。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - ethry

0
每次第一个循环运行时,您需要为 i 初始化一个新数组,并且在创建它之前不需要设置数组的布局(在声明 A 的时候删除 [],[])。请尝试以下代码:

var A = [];
for (var i = 0; i < 12; i++) {
  A[i] = [];
  for (var j = 0; j < 81; j++) {
    A[i][j] = 'q';
  }
}
console.log(A);
.as-console-wrapper { 
    max-height: 100% !important; 
    top: 0; 
}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接