javascript在不同浏览器上排序歧义

时间:2016-05-06 18:25:04

标签: javascript arrays sorting browser cross-browser

我得到了相当标准的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标准不保证这一点   行为

如何在所有浏览器中使其工作相同?如果我的sort函数说两个元素相等,我想要sort函数来保留顺序。

1 个答案:

答案 0 :(得分:2)

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

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


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

entities.sort(sortF);

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