最近幾個月都在刷LeetCode,剛剛,就在剛剛,看到公眾號說華為,京東,阿里等等大廠都在裁員縮招,很是焦慮啊。互聯網的冬天提前來臨了么。。。。
本來數組初始化很簡單,但就是和java,c++他們不一樣,js在創建數組的時候是不會自動初始化的,也就是說js創建數組如果不賦值就會是undefine。總之每次刷題的時候,都會遇到數組沒有初始化而出現NAN的問題,就就就很煩,所以--------代碼如下
// 一維數組初始化 Array.dim=function(dimension,initial){ var res=[],i; for(i=0;i<dimension;i++){ res[i]=initial; } return res; } //二維數組初始化 Array.matrix=function(m,n,initial){ var i,j,res=[]; for(i=0;i<m;i++){ res[i]=[] for(j=0;j<n;j++){ res[i][j]=initial; } } return res; } //console.log(Array.dim(3,0),Array.matrix(2,3,1))
今天補充一下es6有更為簡潔的寫法
數組fill方法用於對數組進行填充,接收3個參數,后兩個不是必填的,參數一:要填充的值,后兩個分別為起始和結束位置
// 一維數組初始化 let arr=new Array(5).fill(0);//[0,0,0,0,0] // 二維數組初始化 let matrix=new Array(5).fill(arr) // [ // [0,0,0,0,0], // [0,0,0,0,0], // [0,0,0,0,0], // [0,0,0,0,0], // [0,0,0,0,0], // ]
特別注意:二維數組初始化時,fill填充的為對象類型(數組)為淺拷貝,換句話說就是如果給二維數組中任意一項賦值,那么那一整列都會賦相同的值了,如下:
更新:2020-8-4
- 一維數組的3種初始化的方法對比
/** * 方法一: 不指定長度,循環賦值 * @param {*} length 數組長度 * @param {*} value 數組項初始值 */ Array.prototype.initial1=function(length,value){ for(let i=0;i<length;i++){ this.push(value); } } /** * 方法一: 指定長度,循環賦值 * @param {*} length 數組長度 * @param {*} value 數組項初始值 */ Array.prototype.initial2=function(length,value){ this.length=length; for(let i=0;i<length;i++){ this[i]=value; } } /** * 方法二:指定長度,es6填充 * @param {*} length 數組長度 * @param {*} value 數組項初始值 */ Array.prototype.initial3=function(length,value){ this.length=length; this.fill(value) } console.time('initial1:'); let arr1=[]; arr1.initial1(5,0); console.log('arr1',arr1); console.timeEnd('initial1:'); console.time('initial2:'); let arr2=[]; arr2.initial2(5,0); console.log('arr2',arr2); console.timeEnd('initial2:'); console.time('initial3:'); let arr3=[]; arr3.initial3(5,0); console.log('arr3',arr3); console.timeEnd('initial3:');
node 執行結果
瀏覽器執行結果
- 繼續進行優化,把一維數組和二維數組的初始化進行整合,代碼如下
// 組初始化 /** * 方法一:不指定長度,循環賦值 * @param {*} row 行數 * @param {*} col 列數,若該值為false則表示該初始化數組為一維數組 * @param {*} value 初始值 */ Array.prototype.initial1=function(row,col,value){ if(col){ for(let i=0;i<row;i++){ this.push([]); for(let j=0;j<col;j++) this[i].push(value); } }else{ for(let i=0;i<row;i++){ this.push(value); } } } /** * 方法二:指定長度,循環賦值 * @param {*} row 行數 * @param {*} col 列數,若該值為false則表示該初始化數組為一維數組 * @param {*} value 初始值 */ Array.prototype.initial2=function(row,col,value){ this.length=row; if(col){ for(let i=0;i<row;i++){ this[i]=[]; this[i].length=col; for(let j=0;j<col;j++){ this[i][j]=value; } } }else{ for(let i=0;i<row;i++){ this[i]=value; } } } /** * 方法三:指定長度,es6填充 * @param {*} row 行數 * @param {*} col 列數,若該值為false則表示該初始化數組為一維數組 * @param {*} value 初始值 */ Array.prototype.initial3=function(row,col,value){ this.length=row; if(col){ for(let i=0;i<row;i++){ this[i]=[]; this[i].length=col; this[i].fill(value) } }else{ this.fill(value) } } const rowCount=10000 const colCount=10000 console.time('initial1:'); let arr1=[]; arr1.initial1(rowCount,colCount,0); // console.log('arr1',arr1); console.timeEnd('initial1:'); console.time('initial2:'); let arr2=[]; arr2.initial2(rowCount,colCount,0); // console.log('arr2',arr2); console.timeEnd('initial2:'); console.time('initial3:'); let arr3=[]; arr3.initial3(rowCount,colCount,0); // console.log('arr3',arr3); console.timeEnd('initial3:');
運行結果對比
node 運行結果
一維數組初始化100條數據時(即rowCount:100,colCount:0,value:0)
一維數組初始化100000條數據時(即rowCount:100000,colCount:0,value:0)
二維數組初始化100 x 100的數據時(即rowCount:100,colCount:100,value:0)
二維數組初始化10000 x 10000數據時(即rowCount:10000,colCount:10000,value:0)
瀏覽器運行結果
一維數組初始化100條數據時(即rowCount:100,colCount:0,value:0)
一維數組初始化100000條數據時(即rowCount:100000,colCount:0,value:0)
二維數組初始化100 x 100的數據時(即rowCount:100,colCount:100,value:0)
二維數組初始化15000 x 15000數據時(即rowCount:15000,colCount:15000,value:0)
由上測試可以得出結論:node和瀏覽器上執行還是有些差異的,執行效率:initial1>initial2>inital3。瀏覽器和node都在多數據的二維數組的初始化的時候fill會比直接賦值慢一些。所以我們初始化數組的時候應該指定數組的長度,這樣執行效率會高一些