web-dev-qa-db-ja.com

array.sort()はIE 11とcompareFunctionでは機能しません

JavaScript Array sort()メソッド に従って配列をソートしています。 compareFunctionパラメーターを使用すると、Internet Explorer11が正しく並べ替えられません。

私は選手とのチーム配列を持っています。これらのプレーヤーには名前があります。

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で正しく機能しないため、SarahよりもWaldoが最初に表示され、ファンが混乱することです。

私はそれを再現できる プランカー を作成しました:

  • Firefox33.1-動作中!! :)
  • Chrome39.0.2171.65-動作中!! :)
  • Internet Explorer11.0.9600-機能しない:(

すべてのブラウザのsort()を解決するアイデアはありますか?

ありがとう!

11
Mario Levrero

比較者が正しくないように見えます:

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

これはtrueまたはfalseを返しますが、順序に応じて-10、または1を返す必要があります。

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>");
  }
}
30
Kos