我有一个带有数组值的var,这些值是字母数字或数字但是作为字母数字,问题是根据值应用排序的最有效方法是什么?我希望按字母顺序对字母数字值进行排序,并在包含数字时按升序排序。
到目前为止,我知道
var myArr=['c','a','b']
myArr.sort(); //gives output a,b,c
如果以后:
myArr=['10','1','2'];
myArr.sort();// gives 1,10,2
但有没有一种快速的方法来决定根据数组的内容使用哪种排序方法?
提前致谢!
答案 0 :(得分:1)
但是如果数组元素是一致的(总是数字字符串或总是非数字字符串),你可以测试其中一个,然后做出决定。
myArr.sort(/^\d+$/.test(myArr[0]) ? numericComparison : stringComparison);
...其中stringComparison
可能是:
function stringComparisons(a, b) {
return a.localeCompare(b);
}
... numericComparison
将如您的问题所示。
如果它们不一致,那么我不会看到你有一个选项,而不是预先扫描阵列以查看你正在处理的内容,然后进行相应的排序,因为你无法在中间取消排序操作,因此您不能假设一个排序操作,而是切换到另一个中途。
答案 1 :(得分:0)
了解列表中的所有内容是否为数字的唯一方法是触摸列表中的所有内容。例如,您可以编写一个函数来确定是否所有内容都是数字:
function hasOnlyNumbers(arr) {
var l = arr.length;
for (var i = 0; i < l; i++) {
if (isNaN(arr[i]) {
return false;
}
}
return true;
}
然后,您可以使用其结果进行排序。如果它们都是数字,则按数字排序,否则按字母顺序排序现在可以通过以下方式实现:
if (hasOnlyNumbers(myArr)) {
myArr.sort(sortNumber);
} else {
myArr.sort();
}
由于任何非数字项暗示它应按字母顺序排序,这与您可以做的一样好,因为hasOnlyNumbers
函数在找到不是数字的东西时立即返回。当然,您需要了解NaN的作用,因为它可能会调用您不期望的数字(如25E7是完全有效数字的指数表示法,isNaN返回false)。
答案 2 :(得分:0)
您可以将逻辑构建到sort函数中。这个想法是两个数字按数字顺序排列,两个字符串按字母顺序排列,字符串按数字排序。
function sortfunc(a, b) {
if (isNaN(a)) {
if (isNaN(b)) { return a < b ? -1 : +1; }
else { return +1; }
} else {
if (isNaN(b)) { return -1; }
else { return +a < +b ? -1 : +1; }
}
}
document.writeln(['b', '1', '20', 'a', '10'].sort(sortfunc).join(' -- '));
&#13;
或者,如果您愿意,可以预转换:
function toNumber(n) { return isNaN(n) ? a : +a; }
myArray
.map(toNumber)
.sort(function(a, b) {
return a < b ? -1 : +1;
});