JavaScriptの連想配列でソート

JavaScriptの連想配列について直感的にまとめます。

通常の配列は次のようなものです。

a[0]=10;
a[1]=5;
a[2]=15;

変数aに添え字0,1,2が付いています。
この添え字に文字列を使うことができ、この場合、連想配列と言います。

a["apple"]=10;
a["orange"]=5;
a["grape"]=15;

通常の配列はsortを使うことで昇順に並べ替えることができます。

a.sort();
a[0]=5;
a[1]=10;
a[2]=15;

ところが連想配列ではこれができません。
また、配列を結合するjoinも使えないようです。

連想配列の場合、

v=a["orange"];

とすることで「5」を取得することができます。また、

v=a.orange;

としても取得できます。
これはExcelなどでおなじみのプロパティと同じ使い方です。
こう考えると、プロパティに順位が付けられないから、ソートできるはずはない、と分かります。
通常の配列は添え字の順番に従いますが、連想配列は配列にセットした順番が維持されます。

しかしソートしたいケースもあります。
例えば、連想配列を使うと集計が容易です。

for(i=0;i<100;i++){
  fruitname=fruit[i];
  a[fruitname]+=1;
}

このようにすれば種類ごとの集計が簡単にできます。
となれば集計結果でソートしたいところです。

次のような関数を使えば連想配列のプロパティとの関係を維持したまま並び変えることができます。

function associative_sort(a){
  var x=[],b=[];
  for(key in a){
    x.push([key,a[key]]);
  }
  x.sort(function(m,n){
    return m[1]-n[1];
  });
  for(i=0;i<x.length;i++){
    b[x[i][0]]=x[i][1];
  }
  return b;
}

連想配列aを全てソート用の配列xに放り込み、ソートして、別の連想配列bに放り込んで返します。
これで一応、昇順に並び変わります。降順にしたければ「m[1]-n[1]」を「n[1]-m[1]」とします。

なお、JavaScriptでは正式には連想配列の順番はあてにしてはいけないらしく、もし順番を正確に処理するには、

a[0][0]="apple";
a[0][1]=10;
a[1][0]="orange";
a[1][1]=5;
a[2][0]="grape";
a[2][1]=15;

のようにするのがいいかもしれません。

コメント

タイトルとURLをコピーしました