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/ksortをJavaScriptに移植していたので以下のようなことができて欲しかった。オブジェクトは参照渡しなのでオブジェクトはそのままでプロパティを消してあげて、また、同じプロパティ代入すればソートできるよねという単純な発想。
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で参照できなくするっていう機能ですねと…。