在IE11中为JavaScript问题创建稳定排序

时间:2017-09-08 19:18:45

标签: javascript sorting internet-explorer prototype stable-sort

我正在尝试为默认的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的限制)所以我​​不得不改变它。不确定我是否错过了其他的东西。

有关正在发生的事情的任何想法?

1 个答案:

答案 0 :(得分:3)

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;
}