【问题标题】:Nested for loop with array pushing producing unwanted results嵌套 for 循环与数组推送产生不需要的结果
【发布时间】:2018-05-17 04:33:53
【问题描述】:

做一个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 个元素到新网格的第一个元素,等等就是我要找的)。

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

【问题讨论】:

    标签: javascript arrays nested-loops


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢,我改变了我的 newGrid 让 newGrid = [...Array(grid.length)].map(x=>[]);现在一切都很好。也很高兴了解有关填充的更多信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-07
    • 1970-01-01
    • 1970-01-01
    • 2018-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多