2014-02-20 37 views
4

我有在我已經在不同的指數漲3個數據的數組,如下使用另一個陣列中的JavaScript

var a=[]; 
    a[1]=4; 
    a[3]=7; 
    a[4]=8; 

現在我的陣列看起來像這樣

a=[undefined, 4, undefined, 7, 8, undefined] 

創建陣列I想從數組中單獨取值並需要添加到另一個數組中。有沒有最簡單的方法,我可以利用它。直到現在我正在使用「for」循環的值,這是可以的,當我有少量的數據。這裏我只需要3個值,但循環執行6次。

在此先感謝

+0

在旁註 - 與整個數組相比,稀疏數組的速度慢_extremely_。數組'空洞'會導致JS引擎在性能上大大降低,並導致非常糟糕的「去優化」。另一方面,全陣列幾乎和C陣列一樣快。如果你解釋用例(爲什麼你在數組中有這些洞),我們可能會給你一個更好的指導答案。我還沒有看到他們的合理用例(我今天可能會感到驚訝:))。 –

回答

1

filter功能是你所追求的。

var newArray = a.filter(function(item) { 
    return item !== undefined; 
}); 
+1

注意,當你有一個未定義但聲明的變量時,不需要檢查'typeof'與undefined。 'typeof var!=='undefined''用於標識符不存在時。函數參數被自動聲明並賦值爲'undefined',所以你可以做'item!== undefined' –

+0

@BenjaminGruenbaum不知道這一點。我會更新我的答案。謝謝:) –

0

原始陣列:

var originalArr = []; 
a[1] = 4; 
a[3] = 7; 
a[4] = 8; 

濾波器邏輯:

function filterUndefined(originalArr){ 
    var valuesArray = []; 
    for(var i = 0; i < originalArr.length; i++){ 
     if(originalArr[i] !== undefined){ 
      valuesArray.push(a[i]); 
     } 
     return valuesArray; 
    } 
} 

結果:

[4,7,8] 
4

無論如何,大多數數組方法都會跳過「空洞」。

如果你不明確希望將它們過濾掉,只是要求他們的陣列方法:

var arr = a.filter(function(){return true}); 

或者簡寫:

[,4,,7,8].filter(function(){ return true}); // [4, 7, 8] 
+1

如果只是數字,你也可以使用'a.filter(isFinite)'。 – elclanrs

+0

@elclanrs我認爲它(或'map(Number)')說實話:)我看到的唯一問題是數組值不是數字,或者聲明的數組值是未定義的。例如有孔 - '[undefined]'應該轉到'[undefined]'而''''''應該轉到'[]' –

+1

是的我猜它具有相當特殊的用途。順便說一句,'.filter(Number)'會過濾掉零,而'isFinite'則不會。 – elclanrs

0

的一點是,只要你設定的指標在一個數組中,而其他先前的索引不存在,你的數組添加了未定義的值。如果你在這個數組中有大量的數據,這不是一個好習慣。

您可以使用過濾器來實際過濾未定義的值,但是,當數組中有大量數據時,您所做的是創建2個數組,其中第一個數組有很多具有未定義值的索引,即不是一個好習慣。我相信它更多的是HashMap而不是Array

,如果我在那裏,你我會用JavaScript對象來代替,並遍歷它像一個數組,你可以這樣做:

var a={}; 
a[1]=4; 
a[3]=7; 
a[4]=8; 
var keys = Object.keys(a); 
for(var i=0;i<keys.length;i++){ 
    var value = a[keys[i]]; 
    //do whatever you want 
} 
0

你可以考慮「鍵/值」對象,而不是一個數組。

> var a={}; 
> a[1]=4; 
> a[3]=7; 
> a[4]=8; 

注意,不同的是,你聲明 'A' 的方式:A = {},而不是= []。