我尝试按字母顺序对字符串数组进行排序,但某些字符串除外(例如"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字符都不起作用。
我也对高性能算法感兴趣!
仅供参考,T. J. Crowder的算法通过jsPerf稍微提高了性能。 Altohugh我更喜欢Halcyon更简洁的方法!
答案 0 :(得分:1)
您可以为排序功能添加例外。我得到了一个聪明的数学:
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
});
答案 1 :(得分:1)
基本上,所有字符串都小于"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());
});
(显然,详细的评论会让它看起来比实际更长......)