美文网首页
sort与localeCompare配合排序

sort与localeCompare配合排序

作者: AAA前端 | 来源:发表于2019-01-28 14:18 被阅读0次
  • 有个需求需要对后台返回的一堆英文品牌进行排序。开始利用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

相关文章

网友评论

      本文标题:sort与localeCompare配合排序

      本文链接:https://www.haomeiwen.com/subject/jlsajqtx.html