2016-08-24 45 views
1

我有以下代码:的Javascript排序回调不工作在所有浏览器

var r = [ 
 
    ['Pipe repair', '3 Bravo', 'Household Baker'], 
 
    ['New connection', '5 Delta', 'Household Griffith'], 
 
    ['Pipe repair', '3 Bravo', 'Household Baker'], 
 
    ]; 
 
r = r.sort(function(a, b) { 
 
    return (a[0] > b[0]) ? 1: 0; 
 
    // EDIT: I mistakingly copied newer code than the original code I was testing. However the answer was still on point. 
 
    // The original code (that worked in Chrome but not Safari or my Rhino environment): 
 
    // return a[0] > b[0]; 
 
}); 
 
    
 
console.log(r)

谷歌浏览器产生一个有序输出一样,node.js中然而,Safari不会(也可能旧版本的Firefox不兼容)。此脚本由Android应用程序中的Rhino翻译器运行

如何在所有浏览器中实现同样的排序(我假设这将解决执行此脚本的平台上的问题) ?

+2

你应该返回一个值< 0, 0, or > 0,不只是'1'或者'0' ... – deceze

+1

'而且很可能旧版本的Firefox不either' - firefox支持array#sort(fn),因为1.0 –

+0

@deceze你击败了我。 – Simba

回答

2

传递给.sort()回调应该返回:

  • -1,如果第一个参数前应第二次排序;
  • 0,如果参数具有相同的排序顺序;
  • 1,如果第二个参数应该排在第一个之前。

你的回调基本上给了Safari的排序机制的不好的答案,所以排序过程会感到困惑。具体而言,当第二个键小于第一个键时,如果键相同,则回拨返回0

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

r = r.sort(function(a, b) { 
    return a[0].localeCompare(b[0]); 
}); 
1

一个问题,我看到的是你的比较功能。

返回0意味着数组的两个条目都具有相同的值。像两个数字相同时的数组中一样。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort作为参考。

报价从那里字符串进行排序:

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; 
}); 
相关问题