我有一个未知长度的数组。
我想找到五个沿数组大致均匀分布的索引值,并且始终包含第一个和最后一个值。
例如,如果我有一个长度为20的数组,我想要索引值:
0, 4, 9, 14, 19
回。
当然,如果数组长度没有整齐地除以5,这就变得更加棘手。
关于最佳方法的任何聪明的想法?
答案 0 :(得分:0)
我希望这适合你:
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);
答案 1 :(得分:0)
如果您想拥有n
个索引值,则应将长度除以(n - 1)并取a[0]
,a[res]
,a[2*res]
,... ,a[(n - 1)*res]
和a[length - 1]
其中res
为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)
答案 2 :(得分:0)
的 jsFiddle Demo
强> 的
如果您有阵列
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);
}