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

时间:2016-08-24 14:18:37

标签: javascript sorting

我有以下代码:

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)

Google Chrome会生成一个已排序的输出,node.js也是如此。但是Safari没有(并且可能旧版本的firefox也没有)。此脚本由Android应用程序中的Rhino解释程序运行

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

2 个答案:

答案 0 :(得分:2)

您传递给| ORDERID | MATERIALNAME | | 123 | SHEET1 | | 123 | SHEET2 | | 123 | EXT1 | | 123 | MISC1 | 的回调应该返回:

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

您的回调基本上是对Safari中的排序机制给出错误的答案,因此排序过程会变得混乱。具体来说,当第二个键小于第一个键时,当键与相同时,回调返回0.

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

.localeCompare()

答案 1 :(得分: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;
});