【问题标题】:javascript sort ambiguity on different browsersjavascript在不同浏览器上的排序歧义
【发布时间】:2016-05-07 02:51:37
【问题描述】:

我得到了相当标准的 JS 数组,类似于:

"entities": [
    {
      "id": "1111",
      "options": {
        "label": "Label",
        "choices": [
          {
            "value": "222222"
          },
          {
            "value": "444444"
          }
        ]
      }
    },
    {
      "id": "2222",
      "options": {
        "label": "Label",
        "choices": [
          {
            "value": "333333"
          },
          {
            "value": "555555"
          }
        ]
      }
    },
...

我得到的排序函数总是告诉两个元素相等,看起来像这样:

function sortF(a,b){
    return 0;
}

现在我对实体数组进行排序,如下所示:

entities.sort(sortF);

我的预期行为没有变化,但不同浏览器的结果不同。例如在 IE 上它很好,但在 Chrome 上它以不同的顺序对数组进行排序。

在 MDN 上,我在排序描述下注意到了这一点,但不确定这是否相关:

如果 compareFunction(a, b) 返回 0,则保持 a 和 b 不变 相互尊重,但对所有不同的事物进行排序 元素。注意:ECMAscript 标准不保证这一点 行为

我怎样才能使它在所有浏览器中都能正常工作?如果我的排序函数说两个元素相等,我希望排序函数保持原样。

【问题讨论】:

标签: javascript arrays sorting browser cross-browser


【解决方案1】:

我建议使用自己的排序属性进行稳定排序:

entities.forEach(function (a, i) {
    a.origin = i;
});


function sortF(a, b){
    return a.origin - b.origin;
}

entities.sort(sortF);

结果,与原始数组排序顺序相同的稳定排序

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-08
    相关资源
    最近更新 更多