用于对字符串数组进行排序的javascript函数在数组长度为10之后表现得很奇怪

时间:2015-11-14 09:20:19

标签: javascript arrays sorting

数组排序函数在数组长度大于10.pasted代码

之后表现得很奇怪
var keys = [ 
      'CHECKSUMHASH',
      'CUST_ID',
      'EMAIL',
      'TEST',
      'INDUSTRY_TYPE_ID',
      'REQUEST_TYPE',
      'CHANNEL_ID',
      'MOBILE_NO',
      'ORDER_ID',
      'payt_STATUS'
       ]

    keys.sort(function(a,b){ return a.toLowerCase() > b.toLowerCase()})

    outputs 
    [ 'CHANNEL_ID',
      'CHECKSUMHASH',
      'CUST_ID',
      'EMAIL',
      'INDUSTRY_TYPE_ID',
      'MOBILE_NO',
      'ORDER_ID',
      'payt_STATUS',
      'REQUEST_TYPE',
      'TEST' ]

但是向数组添加一个额外的字符串并使数组的长度大于10表现得很奇怪。

var keys = [ 
  'CHECKSUMHASH',
  'CUST_ID',
  'EMAIL',
  'TEST',
  'INDUSTRY_TYPE_ID',
  'REQUEST_TYPE',
  'CHANNEL_ID',
  'MOBILE_NO',
  'ORDER_ID',
  'payt_STATUS',
  'a'
   ]

keys.sort(function (a, b) {
        return a.toLowerCase() > b.toLowerCase();
    });
["REQUEST_TYPE", "a", "CHANNEL_ID", "CHECKSUMHASH", "CUST_ID", "EMAIL", "INDUSTRY_TYPE_ID", "MOBILE_NO", "ORDER_ID", "payt_STATUS", "TEST"]

我希望'a'先来'REQUEST_TYPE'。请解释一下这种行为。

2 个答案:

答案 0 :(得分:1)

你的排序功能不正确,请尝试这样的事情:

keys.sort(function (a, b) {
    if (a.toLowerCase() > b.toLowerCase())
        return 1;
    else if (a.toLowerCase() < b.toLowerCase())
        return -1;
    else return 0;
});
编辑:@ T.J. Crowder提到,如果第一个参数较大,则排序函数应返回正数(1),如果较小则返回负数(-1),如果它们相等则返回0;不是真或假。在这种情况下,似乎使用他建议的localeCompare方法可能会更好,因为如果你需要,localeCompare会处理不同的语言,并节省你编写一些代码。

答案 1 :(得分:1)

您正在从sort回调中返回无效值。如果参数相等,回调应该返回0,如果第一个arg是&#34,则返回负数#34;更小&#34;比第一个和正数,如果第一个是&#34;更大&#34;比第二个。

String#localeCompare可以为您提供正确的值:

&#13;
&#13;
var keys = [
  'CHECKSUMHASH',
  'CUST_ID',
  'EMAIL',
  'TEST',
  'INDUSTRY_TYPE_ID',
  'REQUEST_TYPE',
  'CHANNEL_ID',
  'MOBILE_NO',
  'ORDER_ID',
  'payt_STATUS',
  'a'
]

keys.sort(function(a, b) {
  return a.toLowerCase().localeCompare(b.toLowerCase());
});
snippet.log(JSON.stringify(keys));
&#13;
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="//tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
&#13;
&#13;
&#13;