在数组中找到其2个邻居之间的最低数字



我想对foreach内部的一个函数,对于每个由2个较高或相等数字投降的元素,或者是第一个或最后一个元素,只是与第二个或第二个元素相比第二个最后数字。

我提出了此代码,但我确定有更好的方法:

var Pointdata = [98,59,39,0,48,85,19,43,3,98,65,100];
    Pointdata.forEach(function(Current,i,array){
  if (Current <= array[i+1] && Current <= array[i-1]) {
  DrawPoint(Current,i,array);
  }
  else if (Current <= array[i+1] && i == 0) {
  DrawPoint(Current,i,array);
  }
  else if(Current <= array[i-1] && i+1 == array.length) {
  DrawPoint(Current,i,array);
  }
function DrawPoint(Current,i,array) { 
// marks peak points of canavas chart.
}

您只能在内部使用一个条件, Currenta

if ((i + 1 === array.length || a <= array[i + 1]) && (i === 0 || a <= array[i - 1])) {
    DrawPoint(a, i, array);
}

呢?

for (i = 1; i < array.length - 1; i++) {
  var Current = array[i];
  if (Current <= array[i+1] && Current <= array[i-1]) {
   DrawPoint(Current,i,array);
  }
}

几个好处:

  1. 您可以跳过边缘案例,例如开始和结束索引
  2. 只有一个有条件考虑的条件

但是,如果您想保留这些边缘案例,则可以将它们全部写入一个,如果块将它们分开或诸如if ((Current <= array[i+1] && Current <= array[i-1]) || (Current <= array[i+1] && i == 0) || (Current <= array[i-1] && i+1 == array.length))

之类的条件
function markPeaks(data, draw) {
  var xs = [Infinity].concat(data).concat(Infinity)
  xs.forEach(function(x, i, array) {
    if (Number.isFinite(x)) // skip first and last
      if (array[i-1] >= x && x <= array[i+1]) // n-1 ≥ n ≤ n+1
        draw(x, i-1, array) // minus1 because of 1st 'helper' Infinity
  })
}
markPeaks(/*pointdata, /*drawpoint*/)

最新更新