我在处理Leetcode问题1770时遇到了一些奇怪的行为,我希望有人能帮助我理解。
这是一个动态编程问题,需要实例化一个长度为m
的二维数组。相当简单。
奇怪的是,我生成2D数组的语法导致问题失败,但另一种语法通过了所有测试。据我所知,这两行输出的结果完全相同。
我的语法:
// const m = 3
let memo = new Array(m).fill(new Array(m).fill(-Infinity))
console.log({memo})
// stdout: {
// memo: [
// [ -Infinity, -Infinity, -Infinity ],
// [ -Infinity, -Infinity, -Infinity ],
// [ -Infinity, -Infinity, -Infinity ]
// ]
// }
可选语法:
// const m = 3
let memo = Array.from(Array(m), () => Array(m).fill(-Infinity))
console.log({memo})
// stdout: {
// memo: [
// [ -Infinity, -Infinity, -Infinity ],
// [ -Infinity, -Infinity, -Infinity ],
// [ -Infinity, -Infinity, -Infinity ]
// ]
// }
在我看来,两者的输出完全相同。然而,一个人通过了所有的测试,还有什么没有通过。什么东西?
在第一种情况下,使用相同的Array
实例填充数组。在第二种情况下,每一行都是一个新的Array
,因为您提供了一个工厂函数。
const m = 3;
let memo = new Array(m).fill(new Array(m).fill(-Infinity));
console.log(memo[0] === memo[1]); // true
const m = 3
let memo = Array.from(Array(m), () => Array(m).fill(-Infinity));
console.log(memo[0] === memo[1]); // false
附带说明一下,您不需要传递Array
作为Array.from
的第一个参数,ArrayLike
就足够了:
const m = 3
let memo = Array.from({ length: m }, () => Array(m).fill(-Infinity));
console.log(memo);