js 數組初始化


最近幾個月都在刷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會比直接賦值慢一些。所以我們初始化數組的時候應該指定數組的長度,這樣執行效率會高一些

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM