Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于值的Javascript数组排序_Javascript_Arrays_Sorting - Fatal编程技术网

基于值的Javascript数组排序

基于值的Javascript数组排序,javascript,arrays,sorting,Javascript,Arrays,Sorting,我有一个var,它接受一个值数组,这些值是字母数字或数字,但作为字母数字,问题是什么是基于值应用排序的最有效方法?我希望字母数字值按字母顺序排序,如果包含数字,则按升序排序 到目前为止,我知道这一点 var myArr=['c','a','b'] myArr.sort(); //gives output a,b,c 如果稍后: myArr=['10','1','2']; myArr.sort();// gives 1,10,2 但是有没有一种快速的方法可以根据数组的内容决定使用哪种排序方法

我有一个var,它接受一个值数组,这些值是字母数字或数字,但作为字母数字,问题是什么是基于值应用排序的最有效方法?我希望字母数字值按字母顺序排序,如果包含数字,则按升序排序

到目前为止,我知道这一点

var myArr=['c','a','b']
myArr.sort(); //gives output a,b,c
如果稍后:

myArr=['10','1','2'];
myArr.sort();// gives 1,10,2 
但是有没有一种快速的方法可以根据数组的内容决定使用哪种排序方法呢


提前谢谢

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

myArr.sort(/^\d+$/.test(myArr[0]) ? numericComparison : stringComparison);
…其中
stringComparison
可能是:

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

…和
数值比较
将如您的问题所示


如果它们不一致,那么我看不出除了预扫描数组之外还有其他选项来查看你正在处理什么,然后相应地排序,因为你不能取消中间的排序操作,因此,你不能假设其中一个,只能中途切换到另一个。

要知道列表中的所有内容是否都是数字,唯一的方法是触摸列表中的所有内容。例如,您可以编写一个函数来确定所有内容是否都是数字:

function hasOnlyNumbers(arr) {
    var l = arr.length;
    for (var i = 0; i < l; i++) {
        if (isNaN(arr[i]) {
            return false;
        }
    }
    return true;
}

由于任何非数字项都意味着它应该按字母顺序排序,这是您所能做的最好的事情,因为
hasOnlyNumbers
函数在找到非数字项时立即返回。当然,您需要了解isNaN的功能,因为它可能会调用您不期望的数字(比如25E7是完全有效数字的指数表示法,而isNaN返回false)

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

函数sortfunc(a,b){
if(isNaN(a)){
if(isNaN(b)){返回a
你在找这个吗?对
typeof myArr[0]
将返回
'string'
'number'
。这加上一个条件,你就可以得到你所需要的。例如,你有“ab”和“abc”,你想把哪一个放在第一位(我的意思是你要求字母字符的标准是什么)检查更新后的问题。。第二种情况是指数字数组,但形式为字符串。对于这种情况,我能做些什么?@sstauross:检查数字:
如果(/^\d+$/.test(myArr[0])…
我已经更新了答案以显示这一点。当然,但是我们可以开始写
!arr.some(isNaN)
?这不是JavaScript标准的一部分,也不兼容跨浏览器。这是一个值得注意的错误断言。它在很大程度上是JavaScript标准的一部分,除非您对IE实现的老掉牙的ES3标准感兴趣,否则以下是规范参考:。
if (hasOnlyNumbers(myArr)) { 
    myArr.sort(sortNumber);
} else {
    myArr.sort();
}