今天小弟做到 leetcode 的 62 题
var uniquePaths = function (m, n) { // let grid = Array.from(new Array(m), () => new Array(n).fill(1)); let grid = new Array(m).fill(new Array(n).fill(1)) console.log('第一个 log',grid) for (let i = 1; i < m; i++){ for (let j = 1; j < n; j++){ grid[i][j] = grid[i - 1][j] + grid[i][j - 1]; } }; console.log('第二个 log',grid); return grid.pop().pop(); }; niquePaths(7,3);
先上一下代码,这里我想创造一个 m*n,每一项都是 1 的数组,所以用到了 new Array(m).fill(new Array(n).fill(1)); 在第一个 Log 里打印出来的是 [ [ 1, 1, 1 ], [ 1, 1, 1 ], [ 1, 1, 1 ], [ 1, 1, 1 ], [ 1, 1, 1 ], [ 1, 1, 1 ], [ 1, 1, 1 ] ]; OK,正好是我想要的 但是在最后的结果里这个 grid 的数值变成了 [ [ 1, 7, 28 ], [ 1, 7, 28 ], [ 1, 7, 28 ], [ 1, 7, 28 ], [ 1, 7, 28 ], [ 1, 7, 28 ], [ 1, 7, 28 ] ]; 这完全不符合我的逻辑啊 于是看了一下别人代码,用另外一种方法创造数组: let grid = Array.from(new Array(m), () => new Array(n).fill(1));
最后的结果是 [ [ 1, 1, 1 ], [ 1, 2, 3 ], [ 1, 3, 6 ], [ 1, 4, 10 ], [ 1, 5, 15 ], [ 1, 6, 21 ], [ 1, 7, 28 ] ]; 这个答案是我想要且正确的 难道是第一步创造数组的时候出现了问题? 可在第一个 log 里打出来的 grid 都是 [ [ 1, 1, 1 ], [ 1, 1, 1 ], [ 1, 1, 1 ], [ 1, 1, 1 ], [ 1, 1, 1 ], [ 1, 1, 1 ], [ 1, 1, 1 ] ]; 为什么后面会变化呢? 难道涉及到了我不知道的知识点么 有 JS 大佬讲解下么
1
HariopaNic OP 日 主楼在手机上看怎么这么乱 对不住了大家
|
2
2kCS5c0b0ITXE5k2 2021-05-09 20:01:00 +08:00
```
var uniquePaths = function (m, n) { // let grid = Array.from(new Array(m), () => new Array(n).fill(1)); let grid = new Array(m).fill(new Array(n).fill(1)) console.log('第一个 log',grid) for (let i = 1; i < m; i++){ for (let j = 1; j < n; j++){ grid[i][j] = grid[i - 1][j] + grid[i][j - 1]; } }; console.log('第二个 log',grid); return grid.pop().pop(); }; niquePaths(7,3); ``` |
3
des 2021-05-09 20:02:30 +08:00
item = new Array(n).fill(1)
grid = new Array(m).fill(item) 因为 item 都是同一个,也就是说 grid[x]都是同一个 |
4
HariopaNic OP @emeab 学会了 谢了兄弟
|
5
HariopaNic OP @des 恍然大悟 谢谢了!
|
6
Pastsong 2021-05-09 20:14:34 +08:00
new Array(n).fill(object) 实际上是把同一个 object 的引用赋值给所有 index,改其中一个 index 其实是改了引用的那个 object 。fill 原始值( primitive values )是 ok 的是因为 js 里原始值都是值引用。
|
7
HariopaNic OP @Pastsong 谢谢!
|