import { toDate } from "./toDate.mjs"; /** * @name closestIndexTo * @category Common Helpers * @summary Return an index of the closest date from the array comparing to the given date. * * @description * Return an index of the closest date from the array comparing to the given date. * * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc). * * @param dateToCompare - The date to compare with * @param dates - The array to search * * @returns An index of the date closest to the given date or undefined if no valid value is given * * @example * // Which date is closer to 6 September 2015? * const dateToCompare = new Date(2015, 8, 6) * const datesArray = [ * new Date(2015, 0, 1), * new Date(2016, 0, 1), * new Date(2017, 0, 1) * ] * const result = closestIndexTo(dateToCompare, datesArray) * //=> 1 */ export function closestIndexTo(dateToCompare, dates) { const date = toDate(dateToCompare); if (isNaN(Number(date))) return NaN; const timeToCompare = date.getTime(); let result; let minDistance; dates.forEach(function (dirtyDate, index) { const currentDate = toDate(dirtyDate); if (isNaN(Number(currentDate))) { result = NaN; minDistance = NaN; return; } const distance = Math.abs(timeToCompare - currentDate.getTime()); if (result == null || distance < minDistance) { result = index; minDistance = distance; } }); return result; } // Fallback for modularized imports: export default closestIndexTo;