为 IE11 中的 JavaScript 个问题创建稳定排序
Creating stable sort for JavaScript issues in 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;
}
当然这不会排序(或稳定排序),但不会导致语法错误。
不幸的是,开发工具和控制台没有给我指示失败所在的行号。
作为参考,我的代码基于我在此 link 中找到的内容。他们使用的东西与 ES5 不兼容(IE11 的限制)所以我不得不稍微改变一下。不确定我是否错过了其他内容。
对正在发生的事情有什么想法吗?
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;
}
我正在尝试为默认 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;
}
当然这不会排序(或稳定排序),但不会导致语法错误。
不幸的是,开发工具和控制台没有给我指示失败所在的行号。
作为参考,我的代码基于我在此 link 中找到的内容。他们使用的东西与 ES5 不兼容(IE11 的限制)所以我不得不稍微改变一下。不确定我是否错过了其他内容。
对正在发生的事情有什么想法吗?
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;
}