奇怪的Leetcode错误:Array.fill()与新的Array.from()



我在处理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);

最新更新