Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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_Sorting - Fatal编程技术网

Javascript排序回调不适用于所有浏览器

Javascript排序回调不适用于所有浏览器,javascript,sorting,Javascript,Sorting,我有以下代码: var r=[ [‘管道维修’、‘3布拉沃’、‘家庭面包师’], ['New connection'、'5 Delta'、'House Griffith'], [‘管道维修’、‘3布拉沃’、‘家庭面包师’], ]; r=r.sort(函数(a,b){ 返回(a[0]>b[0])?1:0; //编辑:我错误地复制了比我测试的原始代码更新的代码。但是答案仍然正确。 //原始代码(适用于Chrome,但不适用于Safari或my Rhino环境): //返回a[0]>b[0]; })

我有以下代码:

var r=[
[‘管道维修’、‘3布拉沃’、‘家庭面包师’],
['New connection'、'5 Delta'、'House Griffith'],
[‘管道维修’、‘3布拉沃’、‘家庭面包师’],
];
r=r.sort(函数(a,b){
返回(a[0]>b[0])?1:0;
//编辑:我错误地复制了比我测试的原始代码更新的代码。但是答案仍然正确。
//原始代码(适用于Chrome,但不适用于Safari或my Rhino环境):
//返回a[0]>b[0];
});

console.log(r)
传递给
.sort()
的回调应该返回:

  • -1,如果第一个参数应在第二个参数之前排序
  • 0,如果参数具有相同的排序顺序
  • 1,如果第二个参数应在第一个参数之前排序
您的回调基本上对Safari中的排序机制给出了错误的答案,因此排序过程变得混乱。具体来说,当两个键相同且第二个键小于第一个键时,回调函数返回0

要比较字符串,可以在现代浏览器中使用
.localeCompare()
(基本上我所知道的所有浏览器):


我看到的一个问题是比较函数

返回
0
意味着数组的两个条目具有相同的值。就像在数字数组中,当两个数字相同时

请参阅

用于排序字符串的引用:

items.sort(function(a, b) {
    var nameA = a.name.toUpperCase(); // ignore upper and lowercase
    var nameB = b.name.toUpperCase(); // ignore upper and lowercase
    if (nameA < nameB) {
        return -1;
    }
    if (nameA > nameB) {
        return 1;
    }

    // names must be equal
    return 0;
});
items.sort(函数(a,b){
var nameA=a.name.toUpperCase();//忽略大小写
var nameB=b.name.toUpperCase();//忽略大小写
if(nameA名称B){
返回1;
}
//名字必须相等
返回0;
});

您应该返回一个<0、0或>0的值,而不仅仅是
1
0
而且可能旧版本的firefox也不这样做
-firefox从1开始就支持数组排序(fn)。0@deceze你比我快。返回0将足以获得适当的排序(尽管如果两个“键”相同,可能会产生不同的结果)(相同)
items.sort(function(a, b) {
    var nameA = a.name.toUpperCase(); // ignore upper and lowercase
    var nameB = b.name.toUpperCase(); // ignore upper and lowercase
    if (nameA < nameB) {
        return -1;
    }
    if (nameA > nameB) {
        return 1;
    }

    // names must be equal
    return 0;
});