按照中文首字母 a-z排序

发布于 2023-04-05  1597 次阅读


运用api介绍

MDN网站 sort

sort(compareFn)

如果 compareFn(a, b) 大于 0,b 会被排列到 a 之前。
如果 compareFn(a, b) 小于 0,那么 a 会被排列到 b 之前;
如果 compareFn(a, b) 等于 0,a 和 b 的相对位置不变。

MDN网站 localeCompare

referenceStr : 引用字符串
compareString : 比较字符串

locales 可选
表示缩写语言代码(BCP 47 language tag)的字符串,或由此类字符串组成的数组。
对应于 Intl.Collator() 构造函数的 locales 参数。

"zh": 中文
"zh-cmn": 中文普通话
"zh-cmn-Hans": 中文普通话简体

options 可选
一个调整输出格式的对象。对应于 Intl.Collator() 构造函数的 options 参数。
在不支持 Intl.Collator 的实现中,该参数会被忽略。

referenceStr.localeCompare(compareString, locales, options)

返回值
如果引用字符串(referenceStr)存在于比较字符串(compareString)之前则为负数;
如果引用字符串存在于比较字符串之后则为正数;
相等的时候返回 0。

代码实现

let arr = [
  { "areaName": "南京市" }, { "areaName": "大连市" },
  { "areaName": "海口市" }, { "areaName": "长沙市" },
  { "areaName": "无锡市" }, { "areaName": "常州市" },
  { "areaName": "郑州市" }, { "areaName": "天津市" },
  { "areaName": "北京市" }, { "areaName": "广州市" },
  { "areaName": "深圳市" }, { "areaName": "成都市" },
  { "areaName": "西安市" }, { "areaName": "盐城市" },
  { "areaName": "上海市" }, { "areaName": "苏州市" },
  { "areaName": "杭州市" }, { "areaName": "佛山市" },
  { "areaName": "宁波市" }, { "areaName": "武汉市" },
  { "areaName": "重庆市" }, { "areaName": "厦门市" },
  { "areaName": "沈阳市" }, { "areaName": "青岛市" },
  { "areaName": "济南市" }, { "areaName": "福州市" },
  { "areaName": "南昌市" }, { "areaName": "太原市" }
]

//设置中文排序方法
const setChineseSort=(arr,codeName) => {
  //  设置一个存储中文名称的数组
  let newNameArr = arr.map(v=> v[codeName]) || []
  
  // 获取一个经过首字母排序的数组
  let sortArray = newNameArr.sort((str1, str2) => str1.localeCompare(str2, 'zh'))
  console.log('[index.js/74]', sortArray)

  // 对原数组中的数据添加编号
  arr.forEach(el => {
      sortArray.forEach((item, index) => {
        if (el[codeName] == item) {
            el["code"] = index
        }
      })
  })

  // 对数组中编入的序号重新排序
  const  sortArr = (code) => {
    return function (a, b) {
      return a[code] - b[code]
    }
  }
 
  console.log(JSON.stringify(arr));

  // 获取结果
  return arr.sort(sortArr('code'))
    
}

setChineseSort(arr,'areaName')