2015-11-02 137 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中的每个第三个值。

相关问题