带有数组推送的嵌套 for 循环产生不需要的结果
Nested for loop with array pushing producing unwanted results
正在做一个 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'我的 newGrid[i].push(...)
中的变量。不确定为什么要这样做。
当您使用 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 }, () => [])
正在做一个 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'我的 newGrid[i].push(...)
中的变量。不确定为什么要这样做。
当您使用 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 }, () => [])