JS的方法sort默认排序规则

121 阅读2分钟

JS的方法sort默认是按什么方式排序的?

sort() 方法用于对数组的元素进行排序。默认排序顺序是根据字符串Unicode码点。

在Unicode编码中,每个字符都有一个对应的数字编号。这个编号称之为“码点”(code point)。JavaScript内部,字符以UTF-16的格式储存,每个字符固定为2个字节。对于那些需要4个字节储存的常见字符,JavaScript会用两个双字节的形式表示它们。因此,JavaScript允许采用\uxxxx形式表示一个字符,其中xxxx表示字符的Unicode码点。

sort的默认排序

sort默认将数据转换为字符串,然后再按照Unicode码点进行排序;

数字排序

对于数字来讲,这样按照字符串排序的结果并不是按照数字大小来排序的,如果想要按照数字大小进行排序,我们需要传入一个函数来手动实现排序功能

image.png

中文排序

中文排序,按照拼音顺序排序 对于中文汉字,在Unicode编码中占据4个字节。但是,如果将汉字字符串传入sort方法,sort方法内部只会将其视为单个字符进行处理,因此会得到错误的排序结果。 为了避免这个问题,可以使用localeCompare方法代替sort方法。该方法不仅支持汉字等非ASCII字符的排序,还能针对不同地区语言进行自然排序,以实现更加准确和合适的排序效果。

<el-table-column prop="name" label="名称" align="center" :sortable="true" :sort-method="sortName" />  
// methods中方法定义 
sortAuthor(a, b) { return a.name.localeCompare(b.name) }

忽略英文大小写排序

英文大小写均存在时排序,例如自带的排序升序时,会按照unicode编码先排大写然后小写,如果我们想要忽略大小写排序时需要自定义方法如下:

<el-table-column prop="englishName" label="英文名称" align="center" :sortable="true" :sort-method="sortEnglishName" />
// methods中方法定义 
sortEnglishName(a, b) { 
    let res = 0 
    const char1 = a.englishName.toUpperCase() 
    const char2 = b.englishName.toUpperCase() 
    res = char1.charCodeAt(0) - char2.charCodeAt(0) 
    return res 
}

解决null、undefined、0之间的排序

要将 null 或undefined的值转换为空字符串,可以使用逻辑 OR 运算符和空字符串 例如useTime包含null和空字符串,将其转化为空字符串再进行对比排序

 <el-table-column
    v-for="item in tableColumns1"
    :key="item.key"
    :prop="item.key"
    :label="item.title"
    :width="item.width ? item.width : 'auto'"
    :min-width="item.minWidth ? item.minWidth : 120"
    show-overflow-tooltip
    sortable
    :sort-method=" (a,b) => sortColumn(a,b, item.key)"
 >
 </el-table-column>
sortColumn(a,b, key){
    if( ['quantity', 'fillQuantity', 'groupNo'].includes(key) ){
      return a[key] - b[key]
    } else if(key === 'useTime'){
      let val1 = a.useTime || ''
      let val2 = b.useTime || ''
      return val1.localeCompare(val2)
    }  else {
      return a[key].localeCompare(b[key])
    }
  }