読者です 読者をやめる 読者になる 読者になる

Objectをソートしたい

以下のコードを

a,bar,foo,z順で中身を取り出したい。

o = { foo:'foo', a:'0', z:'1', bar:'0' }

こんなコードで…

まぁ一応 0, 0, foo, 1と列挙される。

a = [];
for(i in o) a.push(i);
a.sort(); // 配列のソート関数
for(i=0;i<a.length;i++)
  document.write(o[a[i]]); // 0, 0, foo, 1

ソートした後のオブジェクトを返す

これで妥協。でもなんか、もっさり。

function sort(o)
{
  var i, a = [], b = {};
  for(i in o) a.push(i); a.sort();
  for(i=0;i<a.length;i++) b[a[i]] = o[a[i]];
  return b;
}
o = sort(o);
for(i in o) document.write(o[i]); // 0, 0, foo, 1

以下は無理だ

何をしていたかというとhttp://www.php.net/ksortJavaScriptに移植していたので以下のようなことができて欲しかった。オブジェクトは参照渡しなのでオブジェクトはそのままでプロパティを消してあげて、また、同じプロパティ代入すればソートできるよねという単純な発想。

function ksort(o)
{
  var i, a = [], b = {};
  for(i in o) a.push(i); a.sort();
  for(i=0;i<a.length;i++){
    b[a[i]] = o[a[i]]; delete o[a[i]];
  }
  for(i in b) o[i] = b[i];
}

ksort(o);
for(i in o) document.write(i); // foo, a, z, bar

そういえば delete 演算子って

実際にメモリ上からオブジェクトを消すのではなくJavaScriptで参照できなくするっていう機能ですねと…。