javascript排序数组

Pru*_*goe 7 javascript arrays sorting

我的数组没有正确排序.有人能让我知道我做错了什么吗?

...
 sortArray = new Array ("hello", "Link to Google", "zFile", "aFile");

//sort array
        if (dir == "asc") { 
            sortArray.sort(function(a,b){return a - b}); 
        } else { 
            sortArray.sort(function(a,b){return b - a});
        }

        for(var i=0; i<sortArray.length; i++) { 
            console.log(sortArray[i]);
        }
Run Code Online (Sandbox Code Playgroud)

日志按照输入的顺序显示它们.

mVC*_*Chr 12

您希望在排序中进行比较,而不是减法:

if (dir == "asc") {
    sortArray.sort(function(a, b) {
        a = a.toLowerCase();
        b = b.toLowerCase();
        return a === b ? 0 : a > b : 1 : -1;  
    });
} else {
    sortArray.sort(function(a, b) {
        a = a.toLowerCase();
        b = b.toLowerCase();
        return b === a ? 0 : b > a : 1 : -1;  
    });
}
Run Code Online (Sandbox Code Playgroud)

我还使用toLowerCase()了"链接到谷歌"的适当位置.

编辑:根据评论更新以修复比较问题.

见例→

  • 这个答案在Chrome中似乎不起作用.如果a和b相等,则比较器函数应该返回0;如果a应该被排序到比b更高的索引,则返回正整数;如果a应该被排序到比b更低的索引,则返回负整数. (3认同)

Tim*_*per 7

你试图通过减去你将得到的字符串进行排序NaN.


Doc*_*Max 7

麻烦的是"a - b"将字符串视为数字,它返回NaN.如果您使用以下内容替换您的排序,您将获得您正在寻找的行为(假设您正在寻找区分大小写的排序)

    if (dir == "asc") { 
        sortArray.sort(function(a,b){return a < b ? -1 : 1}); 
    } else { 
        sortArray.sort(function(a,b){return b < a ? -1 : 1});
    }
Run Code Online (Sandbox Code Playgroud)


dav*_*vin 6

您的比较器函数返回NaN,因为它接收两个字符串,并执行减法,这是一个在字符串上没有明确定义的操作.

你应该拥有的更像是:

function(a,b){
   return a>b? 1 : (a<b ? -1 : 0);
}
Run Code Online (Sandbox Code Playgroud)

或者您可以使用localeCompare:

function(a,b){
   return a.localeCompare(b);
}
Run Code Online (Sandbox Code Playgroud)

记住要适当处理的情况下,例如"L" < "a"同时"l" > "a"