数组排序函数在数组长度大于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'。请解释一下这种行为。
答案 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
可以为您提供正确的值:
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;