Array.fill 不同于赋值上的文字 2D 定义



早些时候我一直在尝试 Array.fill 函数,为自己制作了一个充满所有零的 9x9 2D 数组,然后我想更新 [3][4] 值。bam 是所有第四个键的值都会更新的,第一个维度中的每个键([0][4], [1][4], ...)。

我花了一段时间才弄清楚,但似乎 Array.fill 在定义上与字面上的 2D 数组定义有所不同,还是吗?因为那是我不再确定我是否错过了什么的地方。

var arr1 = new Array(9).fill(new Array(9).fill(0));
arr1[3][4] = 1;
console.log(arr1);
//Every fourth key of the 2nd dimension are replaced with 1.
var arr2 = [
    [0, 0, 0, 0, 0, 0, 0, 0, 0], 
    [0, 0, 0, 0, 0, 0, 0, 0, 0], 
    [0, 0, 0, 0, 0, 0, 0, 0, 0], 
    [0, 0, 0, 0, 0, 0, 0, 0, 0], 
    [0, 0, 0, 0, 0, 0, 0, 0, 0], 
    [0, 0, 0, 0, 0, 0, 0, 0, 0], 
    [0, 0, 0, 0, 0, 0, 0, 0, 0], 
    [0, 0, 0, 0, 0, 0, 0, 0, 0], 
    [0, 0, 0, 0, 0, 0, 0, 0, 0]    
];
arr2[3][4] = 1;
console.log(arr2);
//Only the third key of first dimension to fourth key of 2nd is replaced with 1.

更新:这实际上为我开辟了一个好方法,让我学习一些我宁愿知道但不遵守的原因或方式的事情。但是,我认为这个问题现在将更广泛地用于"程序员",而不是这次的编码本身。

请参阅Array.prototype.fill()

fill 方法是一个可变方法,它会改变这个对象 本身,并返回它,而不仅仅是返回它的副本。

解决方法可能是使用 forwhile 循环

var arr1 = Array(9);
for (var i = 0, n = 0; i < arr1.length; i++) {
  // create a new array object at index `i` of `arr1`
  arr1[i] = [];
  while (arr1[i].length < arr1.length) {
    // fill array at index `i` of `arr1` with value of `n` : `0`
    arr1[i][arr1[i].length] = n
  }
}
arr1[3][4] = 1;
document.querySelector("pre").textContent = JSON.stringify(arr1, null, 2)
<pre></pre>

最新更新