嵌套for循环,数组推送产生不需要的结果

时间:2018-05-17 04:33:53

标签: javascript arrays nested-loops

执行leetcode问题的一部分,这是我想要插入行和列的JS代码:

var maxIncreaseKeepingSkyline = function(grid) {
    let newGrid = [...Array(grid.length)].fill([]);

    for (let i = 0; i < grid.length; i++) {
        for (let j = 0; j < grid[i].length; j++) {
            newGrid[i].push(grid[j][i]);
        }
    }

    console.log(newGrid);
};

console.log(maxIncreaseKeepingSkyline([[3,0,8,4],[2,4,5,7],[9,2,6,3],[0,3,1,0]]));

理想情况下,它会产生4个diff阵列,每个阵列中有4个元素,但由于某种原因,它会产生4个相同的阵列,每个阵列有16个元素。它确实产生了我正在寻找的正确顺序,但它没有放在正确的数组中(网格的所有第0个元素到新网格的第0个元素,网格的所有第1个元素到新网格的第1个元素) ,等等,我正在寻找)。

我的调试器显示i(外循环)和j(内循环)确实正确递增,但我的函数似乎同时推送到新网格中的所有4个数组,它忽略了我{中的'i'变量{1}}。不知道为什么会这样做。

1 个答案:

答案 0 :(得分:0)

当您使用fill([])时,您将使用相同的空数组填充每个元素。由于对象本质上是对Javascript中内存位置的引用,因此当您更改任何newGrid子数组时,实际上是在改变它们的所有,因为它们都指向同一个对象

const arr = new Array(2).fill({});
console.log(arr[0] === arr[1]);

在每次迭代时使用Array.from的内置map创建一个新数组:

const newGrid = Array.from({ length: grid.length }, () => [])