array.sort()在带有compareFunction的IE 11中不起作用

时间:2014-11-25 09:43:05

标签: javascript internet-explorer sorting internet-explorer-11 plunker

我正在JavaScript Array sort() Method之后对数组进行排序。当我使用compareFunction参数时,Internet Explorer 11无法正确排序。

我有一个有球员的球队阵容。这些球员有名字:

var team = [
  {name:"Waldo"}, 
  {name:"Sarah"}
  ];

但我希望按照字母顺序在体育场视频板上显示它们。所以我有一个列表可以在DOM准备就绪时附加它们:

MYHTML

<h2>My Team after sorting</h2>
      <button onclick='sortAndDisplay()'>Click here to sort by Name</button>
      <ul id="myTeamAfter">

      </ul>

我的Javascript代码

function sortAndDisplay(){
  $("#myTeamAfter").empty();
  team.sort(function(a, b){return a.name > b.name;});
  for(var i=0; i < team.length; i++){
    $("#myTeamAfter").append( "<li>" + team[i].name + "</li>" );
  }
}

问题是一些俱乐部在他们的体育场馆使用Internet Explorer 11,而当我使用我自己的compareFunction时,sort()函数在IE11上运行不正常,所以Waldo首先显示的比Sarah还要粉丝很困惑

我创建了一个Plunker,您可以在其中重现它:

  • Firefox 33.1 - 工作!! :)
  • Chrome 39.0.2171.65 - 工作!! :)
  • Internet Explorer 11.0.9600 - 不工作:(

是否有想法解决每个浏览器的sort()?

谢谢!

1 个答案:

答案 0 :(得分:27)

您的比较器看起来不正确:

function(a, b){return a.name > b.name;}

这会返回truefalse,但会返回-101,具体取决于排序。

请参阅How to sort strings in JavaScript(特别是localeCompare)。

所以代码应该是:

function sortAndDisplay() {
  $("#myTeamAfter").empty();
  team.sort(function(a, b) {
    if (a.name < b.name) return -1;
    if (a.name > b.name) return 1;
    return 0;
  });
  for (let i = 0; i < team.length; i++) {
    $("#myTeamAfter").append("<li>" + team[i].name + "</li>");
  }
}