utils.ts 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. // @ts-nocheck
  2. import { TimeModeValues } from './type';
  3. import { MODE_NAMES, MODE_MAP, MODE_YEAR, MODE_MONTH, MODE_DATE, MODE_HOUR, MODE_MINUTE, MODE_SECOND } from './constant'
  4. /**
  5. * 根据给定的模式返回具有意义的时间列数组。
  6. * @param {number} mode - 表示时间模式的位掩码。
  7. * @returns {TimeModeValues[]} - 返回具有意义的时间列名称数组。
  8. */
  9. export function getMeaningColumn(mode : any) : TimeModeValues[] {
  10. // 初始化结果数组
  11. const res : TimeModeValues[] = [];
  12. let _mode:number = 0;
  13. if(typeof mode == 'string') {
  14. MODE_MAP.forEach((value, key) => {
  15. if((mode as string).includes(key)) {
  16. _mode = _mode | value;
  17. }
  18. })
  19. } else if(typeof mode == 'number') {
  20. _mode = mode as number
  21. }
  22. if(_mode <= 0) {
  23. return res
  24. }
  25. // 定义对应的位掩码数组
  26. const modeBitmasks = [MODE_YEAR, MODE_MONTH, MODE_DATE, MODE_HOUR, MODE_MINUTE, MODE_SECOND];
  27. // 查找被设置的位掩码
  28. const activeBitmasks = modeBitmasks.filter(bitmask => (_mode & bitmask) != 0);
  29. // 如果没有位掩码被设置,返回空数组
  30. if (activeBitmasks.length == 0) {
  31. return [];
  32. }
  33. // 初始化最长连续子序列和当前连续子序列
  34. let longestSequence : number[] = [];
  35. let currentSequence : number[] = [];
  36. // 遍历所有被设置的位掩码
  37. activeBitmasks.forEach(bitmask => {
  38. // 如果当前序列为空或当前位掩码是前一个位掩码的两倍,则将其加入当前序列
  39. if (currentSequence.length == 0 || bitmask == currentSequence[currentSequence.length - 1] * 2) {
  40. currentSequence.push(bitmask);
  41. } else {
  42. // 如果当前序列长度大于最长序列长度,则更新最长序列
  43. if (currentSequence.length > longestSequence.length) {
  44. longestSequence = currentSequence;
  45. }
  46. // 开始新的序列
  47. currentSequence = [bitmask];
  48. }
  49. });
  50. // 检查最后一个序列是否是最长的
  51. if (currentSequence.length > longestSequence.length) {
  52. longestSequence = currentSequence;
  53. }
  54. // 将最长连续子序列的位掩码转换为对应的模式名并返回
  55. return longestSequence.map(bitmask => MODE_NAMES[modeBitmasks.indexOf(bitmask)]);
  56. }