今天写算法题,遇到了一个小坑,是有关于创建二维数组的,mark一下
怎么创建二维数组
我一般是用Array.fill,比如我们要创建一个m行n列的二维数组,我一般是这样写的:
var dp=Array(m).fill(Array(n).fill(0));
但是在今天的算法题里面,我发现即便我的逻辑是对的,但是最后结果还是不太对,我看了下力扣大神们的写法:
var dp2=Array(m).fill().map(()=>Array(n).fill(0));
我在算法题中把创建二维数组的方式改成了上面大神的这种方式,算法运行成功了,为什么会这样呢,我console.log了一下,发现创建的都是m行n列的数组呀。然后我又判断了一下两者是否相等:
console.log(dp==dp2)
打印出来是false
,怎么会这样呢,我立马想到,是不是因为引用不一样的问题,查阅了一下资料果然如此。
Array.fill()
Array.fill()参数是一个引用类型数据的数组的时候,就相当于把这个数据的地址给了arr的每一项,相当于每一行都指向了同一个地址,那么当我们操作任意一个位置的值的时候,所有的行都会跟着变化,每一行的结果注定是一样的,下面举个例子:
首先创建一个3×3的数组
var dp=Array(3).fill(Array(3).fill(0));
输出肯定没问题:
[[0,0,0],[0,0,0],[0,0,0]]
假如我们现在想给第一项赋值为1:
dp[0][0]=1
然后我们发现数组变成了:
[[1,0,0],[1,0,0],[1,0,0]]
每一行的第一列都赋值成了1
正确创建二维数组的方式
- for循环
let arr=new Array(m)
for(let i=0;i<m;i++){
arr[i]=new Array(n).fill(0);}
- Array.from()
let arr=Array.from(Array(m),()=>new Array(n).fill(0))
- 数组的map方法
let arr=Array(m).fill().map(()=>Array(n).fill(0))
map方法就相当于在数组的每一项里面新建了一个数组
【注意】在这里,不能删除第一个fill(),map方法是对数组中的每个值执行回调函数,数组中必须有值,不然map方法不起作用。fill()不写参数,默认填充undefined;
【题外话】我觉得现在面试对前端工程师的要求太过于苛刻了,当初因为喜欢才去准备这个,越学到后面发现,其实很多工作都不需要前端去做,但是面试都要问,哎,大环境如此,只能加强自身的学习,提升自我竞争力,我觉得不管在哪个行业,做到极致都是无可替代的。为了高效准备秋招,我也开始打算以后开个专栏,专门总结前端八股文了(把牛客网上那些面经都总结下来),如果有时间有精力,我可以整理成pdf(如果没有就算了),希望不要失业把~