我有一个未知长度的数组。
我想找到沿数组大致均匀分布的五个索引值,并且始终包括第一个和最后一个值。
例如,如果我有一个长度为 20 的数组,我想要索引值:
0, 4, 9, 14, 19
背部。
当然,如果数组长度不能被 5 整除,这将变得更加棘手。
关于最好的方法有什么聪明的想法吗?
我有一个未知长度的数组。
我想找到沿数组大致均匀分布的五个索引值,并且始终包括第一个和最后一个值。
例如,如果我有一个长度为 20 的数组,我想要索引值:
0, 4, 9, 14, 19
背部。
当然,如果数组长度不能被 5 整除,这将变得更加棘手。
关于最好的方法有什么聪明的想法吗?
我希望这对你有用:
function range(start, end){
var ra = [];
for(var i=0,s=start,l=end-s+1; i<l; i++,s++){
ra[i] = s;
}
return ra;
}
function arrayEvery(yourArray, start, every){
var newArray = [], yl = yourArray.length;
var al = yl % every === 0 ? yl/every : Math.ceil((yl-start)/every);
for(var i=start,n=0; n<al; i+=every,n++){
newArray[n] = yourArray[i];
}
if(newArray[0] !== yourArray[0])newArray.unshift(yourArray[0]);
if(newArray[newArray.length-1] === yourArray[yl-1]){
return newArray;
}
else{
newArray.push(yourArray[yl-1]);
return newArray;
}
}
var zeroNineteen = arrayEvery(range(0, 19), 4, 5);
var zeroSeventeen = arrayEvery(range(0, 17), 4, 5);
var fourThirtyTwo = arrayEvery(range(4, 32), 7, 3);
var threeFiftyThree = arrayEvery(range(3, 53), 8, 7);
console.log(zeroNineteen); console.log(zeroSeventeen);
console.log(fourThirtyTwo); console.log(threeFiftyThree);
如果你想要n
索引值,你应该将长度除以 (n - 1) 并取a[0]
, a[res]
, a[2*res]
, ...,a[(n - 1)*res]
和a[length - 1]
where res
is floor(length / (n - 1))
( fiddle ):
function foo(rangeLow,rangeHigh,wanted) {
var increment=Math.floor((rangeHigh-rangeLow)/(wanted - 1));
var r = [rangeLow];
for (var i = 1; i < wanted - 1; ++i){
r.push(i * increment + rangeLow);
}
r.push(rangeHigh)
console.log('r', r);
return r;
}
foo(0, 19, 5) // result: 0 4 8 12 19
如果您想要一个更均匀分布的结果,您可以Math.round
在将值推送到数组之前应用,而不是预先设置增量(结果为[0,5,10,14,19]
, fiddle)
如果你有一个数组
var array = get();
然后只需检查长度并使用这些数字
var first = 0;
var last = array.length;
var skip = parseInt(array.length / 4);
for( var i = first; i < last; i += skip ){
//work with array[i]
console.log(i);
}