2014-11-03 177 views
0

我有一个取值为数组的变量,这些值是字母数字或数字,但是作为字母数字,问题是根据值应用排序的最有效方式是什么?我想按字母顺序排序字母数字值和升序,当它包含数字时。基于数值的Javascript数组排序基于数值的数组排序

到目前为止我知道

var myArr=['c','a','b'] 
myArr.sort(); //gives output a,b,c 

,如果以后:

myArr=['10','1','2']; 
myArr.sort();// gives 1,10,2 

但有决定排序基于阵列的内容使用哪种方法的快捷方式?

在此先感谢!

+0

你在找什么? http://stackoverflow.com/questions/1063007/arr-sort-does-not-sort-integers-correctly – ius 2014-11-03 12:50:46

+1

是。'typeof myArr [0]'将返回''字符串'或'数字'。这与条件相结合可以准确地给出你需要的东西。 – 2014-11-03 12:50:56

+0

你有例如“ab”和“abc”你想先放哪一个(我的意思是你要求的字母字符的标准是什么) – Ismail 2014-11-03 12:53:59

回答

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函数就会返回。当然,你需要了解isNaN做什么,因为它可能会调用你是不是期待的东西数字(如25E7是一个完全有效的数量指数形式,并isNaN返回false)。

+0

当然,但我们可以开始写'!arr.some(isNaN)'吗? – 2014-11-03 13:08:46

+0

这不是JavaScript标准的一部分,也不是跨浏览器兼容的。 – Zach 2014-11-03 17:41:36

+0

一个了不起的,不正确的断言。它是JavaScript标准的一部分,除非您指的是由IE <= 8实现的旧式ES3标准。如果您需要支持旧式浏览器,则可以使用多种填充方式,包括由es5-shim提供的填充方式,它也包含在Modernizr中,我假定你熟悉并使用它。 – 2014-11-03 18:03:56

1

但是,如果数组元素是一致的(总是数字字符串或总是非数字字符串),您可以测试其中一个,然后做出决定。

myArr.sort(/^\d+$/.test(myArr[0]) ? numericComparison : stringComparison); 

...其中stringComparison可能是:

function stringComparisons(a, b) { 
    return a.localeCompare(b); 

}

...和numericComparison会在你的问题来,如图所示。

如果不一致的话,我不知道你比其他的选项预扫描该阵列看到你正在处理的是什么,然后相应地排序,因为你无法取消在中间排序操作,所以你不能假设一个,但切换到另一个中途。

+0

检查更新的问题..第二种情况是指数组,但在字符串的形式。我能为这种情况做些什么? – sstauross 2014-11-03 13:05:47

+0

@sstauross:检查数字:'if(/^\d+$/.test(myArr[0]))...'我已经更新了答案以证明这一点。 – 2014-11-03 13:07:07

0

你可以在你的排序函数中构建逻辑。这个想法是两个数字按数字顺序排列,两个字符串按字母顺序排列,字符串按数字排序。

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(' -- ')); 
 

或者,如果你愿意,你可以preconvert:

function toNumber(n) { return isNaN(n) ? a : +a; } 

myArray 
    .map(toNumber) 
    .sort(function(a, b) { 
     return a < b ? -1 : +1; 
    });