2016-09-16 4 views
3

私は24時間のうち3時間に問題があります。円の変数に最も近い値を計算します

a)の午後11時45(23.75)

b)の午前11時30分(11.50)

C)午後12時15分(00.25)

:それは、単純な私は10進表記を使用することができます保つために、

私は、毎回、いつ他の時間が最も近いかを知りたいと思います。

var closestTime = 24 
 
var closestActualTime = 0; 
 

 
for (var i = 0; i < times.length; i++) { 
 
    if (times[i].time == this.time) continue; 
 

 
    var temp = Math.abs(this.time - times[i].time) 
 

 
    if (temp < closestTime) { 
 
    closestTime = temp; 
 
    closestActualTime = times[i].time; 
 
    } 
 
}

私の問題は、23:45と午後12時25分には、実際に本当に近いですが、私は倍以上の剰余タイプ

答えて

0

ループで変数を処理する方法がわからないということです。

デルタ時間の組み合わせを24時間オフセットしてみてください。

最小デルタ時間を選択します。

var times = [23.75, 11.50, 3, 6, 7]; 
 
/** 
 
* timeClosestTo 
 
* 
 
* @param {number} time 
 
* @returns {number} 
 
*/ 
 
function timeClosestTo(time) { 
 
    //Distance variable to compare against 
 
    var distance = 100; 
 
    //Hours in a day 
 
    var day = 24; 
 
    //Current best 
 
    var best = null; 
 
    //Test against all times 
 
    for (var i = 0; i < times.length; i++) { 
 
     //Find best score based upon day 
 
     var d = Math.min(Math.abs((times[i]) - (time)), Math.abs((times[i] + day) - time), Math.abs((times[i]) - (time + day)), Math.abs((times[i] + day) - (time + day))); 
 
     //If best found distance yet, set best to current 
 
     if (d < distance) { 
 
      best = times[i]; 
 
      distance = d; 
 
     } 
 
    } 
 
    //Return best 
 
    return best; 
 
} 
 
console.log("times to deal with:",times.join(", ")); 
 
console.log("closest to 1:", timeClosestTo(1), "closest to 11:", timeClosestTo(11), "closest to 5:", timeClosestTo(5));

0

私はペアでリストを作成し、その後の差を計算することをお勧めします。

違いはpairs配列の3番目の要素です。

デルタを確認する必要があります.12時間を超える場合は、24とデルタとの差分を取る必要があります。

delta = Math.abs(aa - bb); 

if (delta > 12) { 
    delta = 24 - delta; 
} 

function combination(array, size) { 
 
    function c(part, start) { 
 
     var i, l, p; 
 
     for (i = start, l = array.length + part.length + 1 - size; i < l; i++) { 
 
      p = part.slice(); 
 
      p.push(array[i]); 
 
      p.length < size ? c(p, i + 1) : result.push(p); 
 
     } 
 
    } 
 

 
    var result = []; 
 
    c([], 0); 
 
    return result; 
 
} 
 

 
function timeDelta(a, b) { 
 
    function decimalTime(s) { 
 
     var p = s.split(':'); 
 
     return +p[0] + p[1]/60; 
 
    } 
 

 
    function padZero(v) { 
 
     return (v < 10) ? '0' + v : String(v); 
 
    } 
 

 
    var aa = decimalTime(a), 
 
     bb = decimalTime(b), 
 
     delta = Math.abs(aa - bb); 
 

 
    if (delta > 12) { 
 
     delta = 24 - delta; 
 
    } 
 
    return padZero(Math.floor(delta)) + ':' + padZero(Math.round(60 * (delta - Math.floor(delta)))); 
 
} 
 

 
var times = ['23:45', '11:30', '00:15'], 
 
    pairs = combination(times, 2); 
 

 
pairs.forEach(function (a, i, aa) { 
 
    aa[i][2] = timeDelta(a[0], a[1]); 
 
}); 
 

 
console.log(pairs);
.as-console-wrapper { max-height: 100% !important; top: 0; }

0

var times = [23.75,11.50,0.25], 
 
    diffs = times.reduce((d,t1,i,a) => a[i+1] ? d.concat(a.slice(i+1) 
 
                  .map(t2 => [t1,t2,[Math.min(Math.abs(t1-t2),24-Math.abs(t1-t2))] 
 
                       .map(n => ~~n + ":" + (n%1)*60)[0]])) 
 
               : d,[]); 
 
console.log(diffs);

を次のように非常に機能的に私はこの仕事をするだろう
関連する問題