项目开发中常用的数据处理方法

64 阅读2分钟

持续更新中...

数字字符串转换为带千分位逗号的格式,并且保留小数部分
const solution=(s)=>{
    // 负数
    let isMinus = false
    if (str < 0) {
        isMinus = true
        // 转化为正数计算
        str = str * -1
    }
    // 去除前导零
    s = s.replace(/^0+/, '');
    if (s === '') return '0';

    // 分离整数和小数部分
    let [integerPart, decimalPart] = s.split('.');
    decimalPart = decimalPart ? '.' + decimalPart : '';

    // 使用正则表达式添加千分位逗号
    integerPart = integerPart.replace(/\B(?=(\d{3})+(?!\d))/g, ',');

    return (isMinus ? '-' : '') + integerPart + decimalPart;
}
数组对象排序
const arraySort = (key, sortType = 1) => {
  if (sortType === 1) {
    // 升序
    return (val1, val2) => {
      if (val1[key] > val2[key]) {
        return 1
      } else if (val1[key] < val2[key]) {
        return -1
      } else {
        return 0
      }
    }
  } else {
    // 降序
    return (val1, val2) => {
      if (val1[key] < val2[key]) {
        return 1
      } else if (val1[key] > val2[key]) {
        return -1
      } else {
        return 0
      }
    }
  }
}
生成唯一值

在处理数据的时候,我们需要唯一值作为key值来确定操作的是哪条数据。

const setUuid = () => {
  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
    const r = Math.random() * 16 | 0
    const v = c === 'x' ? r : (r & 0x3 | 0x8)
    return v.toString(16)
  })
}
把不规则的一维日期数组整合为连续的日期区间二维数组

在项目开发过程中,由于一些特殊的判断给定的可选日期存在不连续的情况,此方法主要是为了判断当前选择的日期区间是否为连续的日期。

const groupDates = (dates) => {
  if (dates.length === 0) {
    return []
  }
  // 将字符串日期转换为 Date 对象,并按照日期先后排序
  const dateObjects = dates
    .map((dateStr) => new Date(dateStr))
    .sort((a, b) => a - b)

  // 初始化结果数组
  const result = []
  let tempGroup = [dateObjects[0]]

  // 遍历日期对象数组,检查连续的日期
  for (let i = 1; i < dateObjects.length; i++) {
    const currentDate = dateObjects[i]
    const previousDate = dateObjects[i - 1]
    // 判断是否为连续日期
    const diffInDays = (currentDate - previousDate) / (1000 * 60 * 60 * 24)
    if (diffInDays === 1) {
      // 如果是连续日期,添加到当前分组
      tempGroup.push(currentDate)
    } else {
      // 如果不是连续日期,将当前分组加入结果,并重新开始一个新的分组
      result.push(tempGroup.map((date) => date.toISOString().slice(0, 10)))
      tempGroup = [currentDate]
    }
  }
  // 将最后一个分组加入结果数组
  if (tempGroup.length > 0) {
    result.push(tempGroup.map((date) => date.toISOString().slice(0, 10)))
  }
  return result
}