2016-05-06 2 views
1

я получил довольно довольно стандартный набор JS, похожий на этот:Javascript рода двусмысленность в разных браузерах

"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 массив как:

entities.sort(sortF); 

Никаких изменений не мое ожидаемое поведение здесь, но результаты разные в разных браузерах. Например, в IE это нормально, но в Chrome он сортирует массив в другом порядке.

На MDN я заметил это под описание сортировки, но не уверен, если это уместно:

Если compareFunction (а, б) возвращает 0, оставить и Ь без изменений с по отношению друг к другу, но сортируются по всем различным элементам . Примечание: стандарт ECMAscript не гарантирует этого поведения

Как я могу заставить это работать одинаково во всех браузерах? Я хочу, чтобы функция сортировки оставила порядок как есть, если моя функция сортировки говорит о том, что два элемента равны.

+0

Почему вы это делаете? Если вам нужно клонировать массивы, используйте https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice; если «сортировка» на самом деле является лучшим способом, http://stackoverflow.com/questions/3195941/sorting-an-array-of-objects-in-chrome/3195977#3195977. –

+0

На практике моя функция sortF более сложна, но я уменьшил ее, чтобы вернуть 0, и у меня все еще есть эта проблема. – rumburak

+1

* Сорт не обязательно стабильный. * От https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort –

ответ

2

Я предлагаю сделать стабильный сорт с собственным имуществом для сортировки:

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


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

entities.sort(sortF); 

Результат, стабильный сорт с такой же порядок сортировки в качестве исходного массива

Смежные вопросы