我试图按字母顺序排列一个字符串数组,但某些字符串(例如,"NA"和"Wild")应该总是放在最后。排序优先级应该是sorted_values_alphabetically < "NA" < "Wild"。
如果我们有以下数组:
["Wild", "sit", "ipsum", "dolor", "NA", "amet", "lorem"];我希望将其分类如下:
["amet", "dolor", "ipsum", "lorem", "sit", "NA", "Wild"];我在想
arr.sort(function(a,b) {
var aVal = a, bVal = b;
// Hack to make values < "NA" < "Wild"
if (aVal == "NA") aVal = "zzz" + aVal;
if (bVal == "NA") bVal = "zzz" + bVal;
if (aVal == "Wild") aVal = "zzzz" + aVal;
if (bVal == "Wild") bVal = "zzzz" + bVal;
return aVal.toLowerCase().localeCompare(bVal.toLowerCase());
});但这可能并不适用于所有Unicode字符。
我对演算法也很感兴趣!
性能
只是FYI,T.J.Crowder的算法通过jsPerf稍微好一点。我更喜欢Halcyon的更简洁的方法!
发布于 2014-06-18 16:05:13
可以将异常添加到排序函数中。我有一个聪明的数学:
arr.sort(function(a,b) {
var exceptions = [ "NA", "Wild" ], indexA, indexB;
indexA = exceptions.indexOf(a);
indexB = exceptions.indexOf(b);
if (indexA === -1 && indexB === -1) {
return a.toLowerCase().localeCompare(b.toLowerCase()); // regular case
}
return indexA - indexB; // index will be -1 (doesn't occur), 0 or 1
});发布于 2014-06-18 16:05:23
因此,基本上,所有字符串都小于"Wild",除"Wild"以外的所有字符串都小于"NA"。传递给sort的函数应该返回一个负数(如果是a < b )、0 (如果是a == b )或一个正数(如果是a > b )。因此,您可以通过返回适当的值来处理特殊情况:
arr.sort(function(a,b) {
// Everything is less than "Wild"
if (a === "Wild") {
return 1; // a is greater than b
}
if (b === "Wild") {
return -1; // b is greater than a
}
// Everything else is less than "NA"
if (a === "NA") {
return 1; // a is greater than b
}
if (b === "NA") {
return -1; // b is greater than a
}
// Normal result
return a.toLowerCase().localeCompare(a.toLowerCase());
});实例化 (来源)
(很明显,详细的评论使这看起来比实际长.)
https://stackoverflow.com/questions/24290131
复制相似问题