2015-11-02 136 views
4

我得到一個未知數量的數組。 但我只有預定義數量的數據才能顯示/存儲。 如何獲取初始數組的每個第n個元素並在JavaScript中將其減少?例如:我得到一個大小= 10000的數組,但只能顯示n = 2k個元素。Javascript:使用陣列的每第n個元素

我試過這樣: delta = Math.round(10 * n/size)/ 10 = 0.2 - >取初始數組的每個第5個元素。

for (i = 0; i < oldArr.length; i++) { 
    arr[i] = oldArr[i].filter(function (value, index, ar) { 
    if (index % delta != 0) return false; 
    return true; 
    }); 
} 

隨着0.2它總是0,但與其他一些增量(0.3)它是工作。三角洲= 0.4,我工作,但每一秒元素與此相同。我能做些什麼才能使這個工作?

+0

什麼是'N'?什麼是'k'?什麼是'delta'?什麼是'oldArr'? – Oriol

+0

'delta = size/n'怎麼樣? –

+0

0.2均分所有整數,所以總是有'someInt%0.2 == 0'。對於我來說,我認爲你想'someInt%(1/0.2)',也就是'someInt%5' – James

回答

15

也許一個解決辦法:

避免過濾器,因爲你不想循環超過10 000元! 只需使用for循環直接訪問它們!


 
var log = function(val){document.body.innerHTML+='<div></pre>'+val+'</pre></div>'} 
 

 
var oldArr = [0,1,2,3,4,5,6,7,8,9,10] 
 
var arr = []; 
 

 
var maxVal = 5; 
 

 
var delta = Math.floor(oldArr.length/maxVal); 
 

 
// avoid filter because you don't want 
 
// to loop over 10000 elements ! 
 
// just access them directly with a for loop ! 
 
//         | 
 
//         V 
 
for (i = 0; i < oldArr.length; i=i+delta) { 
 
    arr.push(oldArr[i]); 
 
} 
 

 

 
log('delta : ' + delta + ' length = ' + oldArr.length) ; 
 
log(arr);

+0

謝謝,我想就是這樣。特別是因爲這應該比模數檢查更快。而我沒有10k元素。這是一個二維數組,所以在另一個版本中甚至會有10萬次檢查。 – EsoMoa

2

嘗試

arr = oldArr.filter(function (value, index, ar) { 
    return (index % ratio == 0); 
}); 

其中ratio是2,如果你想arr是的oldArr 1/2,3,如果你希望它是oldArr 1/3等。

ratio = Math.ceil(oldArr.length/size); // size in the new `arr` size 

你分別致電的oldAdd一個循環中每個元素filter()和你應該叫filter()整個陣列上獲得新的濾波陣列回來。

+0

不應該是'Math.ceil()'來防止新數組大於期望的大小嗎? – StoicJester

+0

你是對的,我改變了三角洲計算值... – EsoMoa

3

過濾器本身返回一個數組。如果我正確理解你,你不需要周圍的環路。所以:

newArr = oldArr.filter(function(value, index, Arr) { 
    return index % 3 == 0; 
}); 

會將newArr設置爲oldArr中的每個第三個值。

相關問題