-2

我有一个未知长度的数组。

我想找到沿数组大致均匀分布的五个索引值,并且始终包括第一个和最后一个值。

例如,如果我有一个长度为 20 的数组,我想要索引值:

0, 4, 9, 14, 19

背部。

当然,如果数组长度不能被 5 整除,这将变得更加棘手。

关于最好的方法有什么聪明的想法吗?

4

3 回答 3

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);
于 2013-09-20T22:57:16.867 回答
0

如果你想要n索引值,你应该将长度除以 (n - 1) 并取a[0], a[res], a[2*res], ...,a[(n - 1)*res]a[length - 1]where resis 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

于 2013-09-20T22:57:28.053 回答
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);
}
于 2013-09-20T23:01:51.030 回答