48 lines
1.4 KiB
JavaScript
48 lines
1.4 KiB
JavaScript
|
var parse = require('../parse/index.js')
|
||
|
|
||
|
/**
|
||
|
* @category Common Helpers
|
||
|
* @summary Return a date from the array closest to the given date.
|
||
|
*
|
||
|
* @description
|
||
|
* Return a date from the array closest to the given date.
|
||
|
*
|
||
|
* @param {Date|String|Number} dateToCompare - the date to compare with
|
||
|
* @param {Date[]|String[]|Number[]} datesArray - the array to search
|
||
|
* @returns {Date} the date from the array closest to the given date
|
||
|
* @throws {TypeError} the second argument must be an instance of Array
|
||
|
*
|
||
|
* @example
|
||
|
* // Which date is closer to 6 September 2015: 1 January 2000 or 1 January 2030?
|
||
|
* var dateToCompare = new Date(2015, 8, 6)
|
||
|
* var result = closestTo(dateToCompare, [
|
||
|
* new Date(2000, 0, 1),
|
||
|
* new Date(2030, 0, 1)
|
||
|
* ])
|
||
|
* //=> Tue Jan 01 2030 00:00:00
|
||
|
*/
|
||
|
function closestTo (dirtyDateToCompare, dirtyDatesArray) {
|
||
|
if (!(dirtyDatesArray instanceof Array)) {
|
||
|
throw new TypeError(toString.call(dirtyDatesArray) + ' is not an instance of Array')
|
||
|
}
|
||
|
|
||
|
var dateToCompare = parse(dirtyDateToCompare)
|
||
|
var timeToCompare = dateToCompare.getTime()
|
||
|
|
||
|
var result
|
||
|
var minDistance
|
||
|
|
||
|
dirtyDatesArray.forEach(function (dirtyDate) {
|
||
|
var currentDate = parse(dirtyDate)
|
||
|
var distance = Math.abs(timeToCompare - currentDate.getTime())
|
||
|
if (result === undefined || distance < minDistance) {
|
||
|
result = currentDate
|
||
|
minDistance = distance
|
||
|
}
|
||
|
})
|
||
|
|
||
|
return result
|
||
|
}
|
||
|
|
||
|
module.exports = closestTo
|