<h1>
1.什么是稀疏數(shù)組
</h1>
在java,c++中數(shù)組是一段連續(xù)的存儲空間,元素與元素之間沒有空隙,但在js中允許存在有空隙的數(shù)組,這就是稀疏數(shù)組(sparse array)。稀疏數(shù)組就是包含從0開始的不連續(xù)索引的數(shù)組。
<h1>
2.稀疏數(shù)組實例
</h1>
先看個例子
var arr = new Array(3);
arr[100]=1;
console.log(arr.length);
arr.forEach(function(x,i){
console.log(x);});
輸出為
101
1
這樣就創(chuàng)建了一個稀疏數(shù)組,遍歷它是js會跳過這些空隙,但是當我們輸出數(shù)組中空隙位置的值時
var arr = new Array(3);
arr[100]=1;
console.log(arr.length);
console.log(arr[0]);
arr.forEach(function(x,i){
console.log(x);});
輸出為
101
undefined
1
這里的undefined指不存在和在數(shù)組直接量中省略值是產(chǎn)生的undefined是不一樣的,后者是值為undefined
兩者的區(qū)別可以通過in操作符檢測
var a1=[,,]
var a2=new Array(3);
0 in a1;
0 in a2;
第一個判斷為true,因為a1 為[undefined,undefined,undefined]
第二個判斷為false,因為 a2 在索引0初不存在元素
*需要注意的是在省略數(shù)組直接量時使用連續(xù)的逗號,如[1,,3]時得到的是稀疏數(shù)組
<h1>
3.壓縮稀疏數(shù)組
</h1>
js中的數(shù)組一般都是稀疏數(shù)組,通常來說稀疏數(shù)組的遍歷較為困難,我們可以通過filter()方法壓縮其中的空隙,因為filter會跳過空隙,返回密集的數(shù)組
sparse.filter(function(x){
return true;
});
*同樣可以使用filter()方法去除數(shù)組中的null和undefined
arr.filter(function(x){
return x!= undefined && x!= null;
});
<h1>
4.創(chuàng)建密集數(shù)組
</h1>
壓縮稀疏數(shù)組不如直接創(chuàng)建一個密集數(shù)組
var sparse = new Array(3);
var dense = Array.apply(null, Array(3));
sparse.forEach(function(x,i){
console.log('sparse :'+i+x);});
dense.forEach(function(x,i){
console.log('dense :'+i+x);});
數(shù)組dense為密集數(shù)組,這段代碼輸出為
dense: 0 undefined
dense: 1 undefined
dense: 2 undefined
<h1>
5.想法
</h1>
作為java起手的程序員,習慣了連續(xù)的數(shù)組,也習慣將js中的數(shù)組轉(zhuǎn)化為密集數(shù)組使用,避免一些麻煩。但實際上js中沒有類似java中的數(shù)組,因為js中的數(shù)組根本就沒有索引,js中的“索引”其實不是數(shù)字是字符串,因為js的對象就是字符串到任意值的鍵值對,數(shù)組作為一種對象數(shù)據(jù)類型自然不例外。