- 有个需求需要对后台返回的一堆英文品牌进行排序。开始利用sort与localeCompare配合实现了排序问题。
async dealSort() {
let list = await this._dealCheck(); // 获取含有英文品牌的数组
let obj = {}
// A-Z 字母排序
for (let i in list) {
list = list.sort(function(a, b) {
return a.firstLetter.localeCompare(b.firstLetter) // 首字母比较排序
})
}
// 把 A-Z 字母开头的 品牌 分别放到对应的 字母对象里面
for (let i in list) {
obj[list[i].firstLetter] ? obj[list[i].firstLetter].push(list[i]) : obj[list[i].firstLetter] = [list[i]]
}
// A-Z 每个字母对象 里面 按brandName排序
for (let j in obj) {
obj[j].sort(function(a, b) {
return a.brandName.localeCompare(b.brandName)
})
}
return obj // 获得排好序之后的字母对象
}
-
但是,在测试中发现有一台安卓手机排序之后会发现。第二个字母是大写的话,会排在前面。比如 MCM 就在 Marc 前面。
-
在看了w3cschool之后发现,localeCompare() 方法提供的比较字符串的方法,考虑了默认的本地排序规则。ECMAscript 标准并没有规定如何进行本地特定的比较操作,它只规定该函数采用底层操作系统提供的排序规则。所以可能有的手机会产生不同的效果。
-
好了知道原因就好办了。把所有单词都转换为小写或大写就可以解决了。
// A-Z 字母排序
for (let i in list) {
list = list.sort(function(a, b) {
return a.firstLetter.toUpperCase().localeCompare(b.firstLetter.toUpperCase())
})
}
// 把 A-Z 字母开头的 品牌 分别放到对应的 字母对象里面
for (let i in list) {
obj[list[i].firstLetter] ? obj[list[i].firstLetter].push(list[i]) : obj[list[i].firstLetter] = [list[i]]
}
// A-Z 每个字母对象 里面 按brandName排序
for (let j in obj) {
obj[j].sort(function(a, b) {
return a.brandName.toUpperCase().localeCompare(b.brandName.toUpperCase())
})
}
-
最终效果
test.jpg
网友评论