index.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.default = closestIndexTo;
  7. var _index = _interopRequireDefault(require("../toDate/index.js"));
  8. var _index2 = _interopRequireDefault(require("../_lib/requiredArgs/index.js"));
  9. /**
  10. * @name closestIndexTo
  11. * @category Common Helpers
  12. * @summary Return an index of the closest date from the array comparing to the given date.
  13. *
  14. * @description
  15. * Return an index of the closest date from the array comparing to the given date.
  16. *
  17. * @param {Date | Number} dateToCompare - the date to compare with
  18. * @param {Array<Date> | Array<number>} datesArray - the array to search
  19. * @returns {Number | undefined} an index of the date closest to the given date or undefined if no valid value is given
  20. * @throws {TypeError} 2 arguments required
  21. *
  22. * @example
  23. * // Which date is closer to 6 September 2015?
  24. * const dateToCompare = new Date(2015, 8, 6)
  25. * const datesArray = [
  26. * new Date(2015, 0, 1),
  27. * new Date(2016, 0, 1),
  28. * new Date(2017, 0, 1)
  29. * ]
  30. * const result = closestIndexTo(dateToCompare, datesArray)
  31. * //=> 1
  32. */
  33. function closestIndexTo(dirtyDateToCompare, dirtyDatesArray) {
  34. (0, _index2.default)(2, arguments);
  35. var dateToCompare = (0, _index.default)(dirtyDateToCompare);
  36. if (isNaN(Number(dateToCompare))) return NaN;
  37. var timeToCompare = dateToCompare.getTime();
  38. var datesArray;
  39. // `dirtyDatesArray` is undefined or null
  40. if (dirtyDatesArray == null) {
  41. datesArray = [];
  42. // `dirtyDatesArray` is Array, Set or Map, or object with custom `forEach` method
  43. } else if (typeof dirtyDatesArray.forEach === 'function') {
  44. datesArray = dirtyDatesArray;
  45. // If `dirtyDatesArray` is Array-like Object, convert to Array. Otherwise, make it empty Array
  46. } else {
  47. datesArray = Array.prototype.slice.call(dirtyDatesArray);
  48. }
  49. var result;
  50. var minDistance;
  51. datesArray.forEach(function (dirtyDate, index) {
  52. var currentDate = (0, _index.default)(dirtyDate);
  53. if (isNaN(Number(currentDate))) {
  54. result = NaN;
  55. minDistance = NaN;
  56. return;
  57. }
  58. var distance = Math.abs(timeToCompare - currentDate.getTime());
  59. if (result == null || distance < Number(minDistance)) {
  60. result = index;
  61. minDistance = distance;
  62. }
  63. });
  64. return result;
  65. }
  66. module.exports = exports.default;