Создание стабильной сортировки для проблем JavaScript в IE11
Я пытаюсь создать стабильный элемент сортировки для функции JavaScript .sort() по умолчанию. У меня это работает во всех браузерах, кроме IE11 и ниже.
Вот код:
Array.prototype.stableSort = function(cmp) {
cmp = !!cmp ? cmp : (function(a, b) {
if (a < b) return -1;
if (a > b) return 1;
return 0;
});
let stabilizedThis = this.map(function(el, index) { return [el, index]; });
stabilizedThis.sort(function(a, b) {
let order = cmp(a[0], b[0]);
if (order != 0) return order;
return a[1] - b[1];
});
for (let i=0; i<this.length; i++) {
this[i] = stabilizedThis[i][0];
}
return this;
}
Для справки приведенный выше код завершается ошибкой, даже когда я на самом деле не использую эту функциональность стабильной сортировки в своем коде. Мое использование будет примерно таким:
sortedArray.stableSort(function(a,b) {
if (type == "string") {
return a[index]["value"].toString().localeCompare(b[index]["value"].toString());
}
else if (type == "number") {
return a[index]["value"] - b[index]["value"];
}
});
Примечание: чтобы сузить проблему, я обнаружил, что - как минимум, этот код работает в IE11:
Array.prototype.stableSort = function(cmp) {
cmp = !!cmp ? cmp : (function(a, b) {
if (a < b) return -1;
if (a > b) return 1;
return 0;
});
// everything here was removed for testing
return this;
}
Конечно, это не сортирует (или стабильная сортировка), но это не вызывает синтаксическую ошибку.
К сожалению, инструменты разработки и консоль не дают мне указание номера строки, где происходит сбой.
Для справки я основываю свой код на том, что нашел по этой ссылке. Они использовали вещи, которые не были совместимы с ES5 (предел IE11), поэтому мне пришлось немного его изменить. Не уверен, что я пропустил что-то еще с этим.
Есть идеи о том, что происходит?
1 ответ
Microsoft IE11 не поддерживает ES6, как let
заявления.
Вы можете заменить его на var
заявления.
Array.prototype.stableSort = function (cmp) {
cmp = cmp ||function (a, b) {
if (a < b) return -1;
if (a > b) return 1;
return 0;
};
var stabilizedThis = this.map(function (el, index) { return [el, index]; });
stabilizedThis.sort(function (a, b) {
return cmp(a[0], b[0]) || a[1] - b[1];
});
for (var i = 0; i < this.length; i++) {
this[i] = stabilizedThis[i][0];
}
return this;
}