js数组排序,为什么我得到的结果是错误的

原数组:

var arr =[
    {key:"insuranceId",value:"39"},
    {key:"policyHolderBirthday",value:"19900909"},
    {key:"insurant",value:"东东"},
    {key:"policyHolder",value:"东东"},
    {key:"insurantCardNo",value:"111111111111"},
    {key:"insurantCardTypeId",value:"1"},
    {key:"insurantBirthday",value:"19900909"},
    {key:"insurantSex",value:"1"},
    {key:"insurancePriceId",value:"1"},
    {key:"policyHolderCardNo",value:"111111111111111"},
    {key:"policyHolderCardTypeId",value:"1"},
    {key:"policyHolderEmail",value:"11111111111111@qq.com"},
    {key:"policyHolderPhone",value:"1"},
    {key:"policyHolderSex",value:"1"},
    {key:"relationId",value:"1"},
    {key:"salesmanId",value:"1"},
]

函数一:
arr.sort(function(a, b){
    return a.key+"">b.key+""
})

结果一:
[ { key: 'insurancePriceId', value: '1' },
  { key: 'insuranceId', value: '39' },
  { key: 'policyHolderCardNo', value: '11111111111111111' },
  { key: 'insurant', value: '东东' },
  { key: 'policyHolderCardTypeId', value: '1' },
  { key: 'insurantCardNo', value: '111111111111111111111' },
  { key: 'insurantBirthday', value: '19900909' },
  { key: 'insurantCardTypeId', value: '1' },
  { key: 'insurantSex', value: '1' },
  { key: 'policyHolder', value: '东东' },
  { key: 'policyHolderBirthday', value: '19900909' },
  { key: 'policyHolderEmail', value: '11111111111@qq.com' },
  { key: 'policyHolderPhone', value: '1' },
  { key: 'policyHolderSex', value: '1' },
  { key: 'relationId', value: '1' },
  { key: 'salesmanId', value: '1' } ]
函数二:
arr.sort(function(a, b){
    a=a.key,b=b.key
    let length = a.length > b.length ? a.length :b.length
    for(let i = 0;i<length; i++){
        if(a[i]==b[i]){
            continue;
        }else{
            return  a[i]+"">b[i]+""
        }
    }
})

结果二:
[ { key: 'insurancePriceId', value: '1' },
  { key: 'insuranceId', value: '39' },
  { key: 'policyHolderCardNo', value: '130681199009091238' },
  { key: 'insurant', value: '东东' },
  { key: 'insurantCardNo', value: '11111111111091238' },
  { key: 'insurantCardTypeId', value: '1' },
  { key: 'insurantBirthday', value: '19900909' },
  { key: 'insurantSex', value: '1' },
  { key: 'policyHolderBirthday', value: '19900909' },
  { key: 'policyHolderCardTypeId', value: '1' },
  { key: 'policyHolderEmail', value: '111111111111@qq.com' },
  { key: 'policyHolderPhone', value: '1' },
  { key: 'policyHolderSex', value: '1' },
  { key: 'policyHolder', value: '东东' },
  { key: 'relationId', value: '1' },
  { key: 'salesmanId', value: '1' } ]
阅读 3.8k
3 个回答

你是用key进行sort()排序,都是字符串,并不是数字,所有js或默认将字符串转换为ASCII码,然后再进行排序,所以你看上去就感觉不对了,你查查你的字符串转成ASCII码后的值就明白了

首先,什么才是“正确”的呢?

姑且认为你要的是按字典序升序吧。

arr.sort(function(a, b){
    return a.key == b.key ? 0 : a.key > b.key ? 1 : -1
})

基础知识:排序函数要返回一个可判断正负的值,而布尔值显然是会出现奇怪的问题。
Array.prototype.sort() - MDN

你的代码在Firefox上运行是正常的,在Chrome上不正常,stackoverflow上有许多类似的问题。
建议改为:

var results = arr.sort((a,b)=>a.key.localeCompare(b.key))
console.table(results)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题