2016-09-16 7 views
3

У меня проблема, когда у меня есть 3 раза 24-часовой день. Для того, чтобы сохранить его простым, я могу использовать десятичное представление:Вычислите ближайшее значение по круговой переменной

а) 23:45 (23,75)

б) 11:30 (11,50)

с) 00:15 (00,25)

Я хотел бы знать, для каждого раза, в какое другое время самое близкое.

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 и 00:25, на самом деле очень близки, но я не знаю, как процесс переменной с типом по модулю

ответ

0

Loop более раз.

Попробуйте комбинации дельта-времени, смещение на 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.

В принципе, вам нужно проверить дельту, и если она больше 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);