js实现集合根据某个字段排序功能

js实现集合根据某个字段排序功能

// 中文字符串排序,包括空格、数字、英文类的字符串
export function sortDevName(str1, str2) {
  let res = 0
  for (let i = 0; ;i++) {
    if (!str1[i] || !str2[i]) {
      res = str1.length - str2.length
      break
    }
    const char1 = str1[i]
    const char1Type = getChartType(char1)
    const char2 = str2[i]
    const char2Type = getChartType(char2)
    // 类型相同的逐个比较字符
    if (char1Type[0] === char2Type[0]) {
      if (char1 === char2) {
        continue
      } else {
        if (char1Type[0] === 'zh') {
          res = char1.localeCompare(char2)
        } else if (char1Type[0] === 'en') {
          res = char1.charCodeAt(0) - char2.charCodeAt(0)
        } else {
          res = char1 - char2
        }
        break
      }
    } else {
      // 类型不同的,直接用返回的数字相减
      res = char1Type[1] - char2Type[1]
      break
    }
  }
  return res
}
export function getChartType(char) {
  // 数字可按照排序的要求进行自定义,我这边产品的要求是
  // 数字(0->9)->大写字母(A->Z)->小写字母(a->z)->中文拼音(a->z)
  if (/^[\u4e00-\u9fa5]$/.test(char)) {
    return ['zh', 300]
  }
  if (/^[a-zA-Z]$/.test(char)) {
    return ['en', 200]
  }
  if (/^[0-9]$/.test(char)) {
    return ['number', 100]
  }
  return ['others', 999]
}
/**
* 降序
*/
export function desc(property) {
  switch (property) {
  case 'date类型':
    return function(a, b) {
      return Date.parse(b[property]) - Date.parse(a[property])
    }
  case '数字类型':
    return function(a, b) { return b[property] - a[property] }
  default: //字符串
    return function(a, b) { return sortDevName(b[property], a[property]) }
  }
}
/**
* 升序
*/
export function asc(property) {
  switch (property) {
  case 'date类型':
    return function(a, b) {
      return Date.parse(a[property]) - Date.parse(b[property])
    }
  case '数字类型':
    return function(a, b) { return a[property] - b[property] }
  default: //字符串
    return function(a, b) { return sortDevName(a[property], b[property]) }
  }
}
// 引用实现
data.sort(asc('name'))
data.sort(desc('name'))

做的不好,仅供参考。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值