2016-09-30 258 views
1

我有一個數組將取n個值,但是這些值將被添加到不同的索引在不同的時間。但是,我需要在特定時間的陣列長度。稀疏數組的長度

案例1

var a = [1,2,3,3,4] 

a.length //Returns 5 - OK 

案例2

var a =[] 
a[20] = 2 
a.length //Returns 21 but I would like it to return 1 

如何獲得長度1情況下2

+0

讓它返回1的唯一方法是在其中只有1個元素...'a [0] = 2'或者你是否想要'length'返回數字具有價值的元素? – Archer

+3

爲什麼你想把元素放在第20位?如果沒有,你可以‘我這樣做,因爲這是可能的‘’*這聽起來有些不可思議使用'推」 @PraneshRavi *推動要素英寸 – SachiDangalla

+0

’! –

回答

2

如果您可以使用underscorelodash。你可以試試這樣的

var arrLen = _.compact(youArr).length; 

如果你想使用純粹的JS ..你需要編寫簡單的功能。這將計算不等於假的元素數量。

var len = 0; 
arr.forEach(function(el){ 
    if (el) {count++;} 
}); 
console.log(len); 

希望這會有所幫助。

+1

你真棒。我正在用'lodash'而不是'underscore'。謝謝! –

3

如果您需要計數未未定義的元素個數:

var a = []; 
 
a[20] = 2; 
 

 
// count number of elements in a that are not undefined 
 
var count = a.filter(x => typeof x !== 'undefined').length; 
 

 
console.log(count); // prints 1

+1

或者,也可以不用創建一個新的數組來查看它有多少個元素,只需使用'.reduce()'返回一個數字。 – vlaz

0

您可以用Array#forEach計算的項目。

forEach()執行提供的回調一次本升序對數組中的每個元素。對於已刪除或未初始化的索引屬性(即在稀疏數組上),不會調用它。

var a = [1, 2, 3, 3, 4]; 
 

 
console.log(a.length); // 5 
 
a[20] = 2; 
 
console.log(a.length); // 21 
 
var length = 0; 
 
a.forEach(function() { length++; }); 
 
console.log(length); // 6

0

我認爲像這樣將滿足您的需求,雖然目前還不清楚爲什麼你會放一個元素到第20位。

function dynlength(array) { 
    var length = 0; 
    for (var i = 0; i < array.length; i++) 
     if (array[i] !== undefined) length++; 
    return length; 
} 
0

first var a = []; 到陣列中元素的返回長度爲

當你說一個[20] ='x';

陣列實際上得到21元(以設置爲你的價值20元),初始化並記住21元素的數組中數

,如果你想自定義值嘗試在循環迭代爲

var count=0; 
for(var i=0;i<a.length;i++) 
{ 
if(a[i]!=undefined) 
    { 
    count++; 
    } 
} 
console.log(count); 
+0

'null'和'undefined'是兩個不同的值。索引0-19處的元素將* undefined *,而不是null。 – Frxstrem

+0

yea..edited我的答案....只是試圖把我的解決方案...將確保下次我沒有犯錯誤..感謝指出...! :d – RohitS

0

使用arr.length屬性將返回包含'洞'的總長度

您可以使用forEach()方法跳過數組中的孔。

var arr1 = []; 
var count = 0; 

arr1[20] = 2; 

alert(arr1.length);// this will always return including 'holes' 

arr1.forEach(function(ele, i) { //this will skip the holes and will take real values into account 
    count++; 
}); 
alert(count); 

您還可以檢查每個索引中的「未定義」值並添加到count變量中。但要小心使用'未定義'來清空數組中的'洞'。

您可以檢查http://speakingjs.com/es5/ch18.html#array_holes

2

很多問題的答案建議要麼通過數組循環或創建一個新的數組,然後計算該(什麼_.compact一樣)。我認爲所有這些都是錯誤的方法,因爲使用.reduce使得這完全無關緊要。

var arr = []; 
 

 
arr[7] = 1; 
 
arr[17] = 2 
 
arr[33] = 0; 
 
arr[9001] = 4 
 

 
var count = arr.reduce(x => x+1, 0); 
 

 
console.log(count);

它是一條線或19個字節的代碼來做到這一點。這是因爲.reduce而不是經過數組中的空白點,因此它只會訪問顯式填充的indeces。然後就算這些。

要知道,如果你有明確設置爲undefined任何的indeces,他們所證明仍然算作填充。所以,如果是這樣的話,那麼你就需要在回調考慮到它,例如

var arr = []; 
 

 
arr[17] = 2 
 
arr[42] = undefined 
 

 
var count = arr.reduce(x => x+1, 0); 
 
console.log(count); 
 

 
var filteredCount = arr.reduce((x, value) => typeof value !== "undefined" ? x+1 : x, 0); 
 
console.log(filteredCount);

0

可以算陣列的「鑰匙」(即人口指數):

Object.keys(arr).length