JS的方法sort默认是按什么方式排序的?
sort() 方法用于对数组的元素进行排序。默认排序顺序是根据字符串Unicode码点。
在Unicode编码中,每个字符都有一个对应的数字编号。这个编号称之为“码点”(code point)。JavaScript内部,字符以UTF-16的格式储存,每个字符固定为2个字节。对于那些需要4个字节储存的常见字符,JavaScript会用两个双字节的形式表示它们。因此,JavaScript允许采用\uxxxx形式表示一个字符,其中xxxx表示字符的Unicode码点。
sort的默认排序
sort默认将数据转换为字符串,然后再按照Unicode码点进行排序;
数字排序
对于数字来讲,这样按照字符串排序的结果并不是按照数字大小来排序的,如果想要按照数字大小进行排序,我们需要传入一个函数来手动实现排序功能
中文排序
中文排序,按照拼音顺序排序 对于中文汉字,在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])
}
}