Javascript排序回调不能在所有浏览器上工作

Javascript sort callback not working on all browsers

本文关键字:浏览器 工作 排序 回调 不能 Javascript      更新时间:2023-09-26

我有以下代码:

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解释器运行的

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

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

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

你的回调对Safari中的排序机制给出了错误的答案,所以排序过程变得混乱。具体来说,当键相同时,当第二个键小于第一个键时,回调返回0。

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

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

我发现一个问题是你的比较功能。

返回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;
});
相关文章: