【问题标题】:JavaScript Sort function Output is different in Mozilla Firefox Compared to Google ChromeJavaScript 排序功能 Mozilla Firefox 中的输出与 Google Chrome 不同
【发布时间】:2019-08-25 11:54:33
【问题描述】:

我有一个 JavaScript 对象数组,如下所示。

players = [{"player": "CR7", "status": false, "fullname": "Cristiano Ronaldo"},
 {"player": "NJR11", "status": false, "fullname": "Neymar Jr."},
 {"player": "SC11", "status": false, "fullname": "Sunil Chhetri"},
 {"player": "LM10", "status": true, "fullname": "Lionel Messi"},
 {"player": "SG19", "status": false, "fullname": "Sergio Aguero"}
];

我还使用以下方法对数组进行排序。我的预期结果是状态为 true 的对象应该排在第一位,其余对象保持顺序。

players.sort((p) => (p.status) ? -1 : 1);

它在谷歌浏览器中运行良好,如下所示。

         [{"player":"LM10","status":true,"fullname":"Lionel Messi"},
          {"player":"CR7","status":false,"fullname":"Cristiano Ronaldo"},
          {"player":"NJR11","status":false,"fullname":"Neymar Jr."},
          {"player":"SC11","status":false,"fullname":"Sunil Chhetri"},
          {"player":"SG19","status":false,"fullname":"Sergio Aguero"}
         ]

但在 Mozilla Firefox 和 Android 默认浏览器中,如下所示,这不是我想要的。

        [{"player":"LM10","status":true,"fullname":"Lionel Messi"},
         {"player":"SG19","status":false,"fullname":"Sergio Aguero"},
         {"player":"SC11","status":false,"fullname":"Sunil Chhetri"},
         {"player":"NJR11","status":false,"fullname":"Neymar Jr."},
         {"player":"CR7","status":false,"fullname":"Cristiano Ronaldo"}
         ]

为什么它在 Firefox 中的行为不同以及像 Chrome 一样工作的解决方案是什么??

【问题讨论】:

    标签: javascript google-chrome sorting firefox javascript-objects


    【解决方案1】:

    对于布尔值,您需要反向排序,因为true 被解释为1false 为零。

    为了首先获得true 的值,您需要从a 中减去b

    var players = [{ player: "CR7", status: false, fullname: "Cristiano Ronaldo" }, { player: "NJR11", status: false, fullname: "Neymar Jr." }, { player: "SC11", status: false, fullname: "Sunil Chhetri" }, { player: "LM10", status: true, fullname: "Lionel Messi" }, { player: "SG19", status: false, fullname: "Sergio Aguero" }];
    
    players.sort((a, b) => b.status - a.status); true frist
    
    console.log(players);

    您提供的另一个解决方案是通过回调。

    var players = [{ player: "CR7", status: false, fullname: "Cristiano Ronaldo" }, { player: "NJR11", status: false, fullname: "Neymar Jr." }, { player: "SC11", status: false, fullname: "Sunil Chhetri" }, { player: "LM10", status: true, fullname: "Lionel Messi" }, { player: "SG19", status: false, fullname: "Sergio Aguero" }],
        sortBy = p => p.status ? -1 : 1; // true first
    
    players.sort((a, b) => sortBy(a) - sortBy(b));
    
    console.log(players);

    【讨论】:

      【解决方案2】:

      你基本上是在洗牌。它会随机播放您期望它在 Chrome 中的排序方式意外。你的排序根本不起作用。 sort 毕竟有两个元素,你必须比较:

      players.sort((a, b) => b.status - a.status);
      

      这是以下的简写形式:

      players.sort((a, b) => {
        if(a.status === b.status) return 0; // order doesnt matter
        if(a.status) return -1; // only a has status, comes first
        if(b.status) return 1 // only b has status, comes first
      });
      

      或者:

       players = [...players.filter(it => it.status), ...players.filter(it => !it.status)];
      

      可能会更快,具体取决于引擎使用的排序算法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-16
        • 2015-06-03
        相关资源
        最近更新 更多