Javascriptの配列がキー値で自動ソートされてしまう件
たとえば、PHPなどで動的に生成される登録順(数値型)をキー値とした配列があるとします。
var ary = {1:”はげ”, 2:”ほげ”, 3:”ひげ”, 4:”ふげ”}
これを50音順でソートされた形のデータが欲しいとします。
var ary = {1:”はげ”, 3:”ひげ”, 4:”ふげ”, 2:”ほげ”}
しかしこの配列を実際に読み込ますと、自動でキー値でソートされてしまいます。
var ary = {1:”はげ”, 3:”ひげ”, 4:”ふげ”, 2:”ほげ”}
//// Jqueryのeachを使う
$.each(ary, function(i, val){
console.log(i+’:’+val);
});
//// for inを使う
for(i in ary){
console.log(i+’:’+ary[i]);
};
//// 結果
どっちもキー値順で出てくる
1:はげ
2:ほげ
3:ひげ
4:ふげ
以前はIE9やsafariなど特定のブラウザのみに発生する挙動の違いという扱いでしたが、最近では
ほぼ全てのメジャーなブラウザで起こるようになってますね。仕様ということでしょうか。
これを回避する方法を調べたのですがなかなかピンと来るのがありませんでした。
例ではひらがなだけを使用した単純な値4つのみですが、実際には漢字やアルファベットも混ざった結構な数のデータとなるので
単純にJavascript上で値でソートするというのは避け、配列生成する段階でなんとかしたいところです。
そうなると、
それぞれの要素を順番でラップする(順番情報を埋め込む)とか
var ary = {1:{1:”はげ”}, 2{3:”ひげ”}, 3:{4:”ふげ”}, 4:{2:”ほげ”}}
キーの頭にアンダースコア付けて、キー値が必要な時ははずしてやるとか
var ary = {_1:”はげ”, _3:”ひげ”, _4:”ふげ”, _2:”ほげ”}
$.each(ary, function(i, val){
console.log(i.replace(“_”, “”)+’:’+val);
});
$.each(ary, function(i, val){
console.log(i.replace(“_”, “”)+’:’+val);
});
こういうことになってしまいます。
既存の作成物のカスタマイズとなるので配列読み込みロジックの大幅変更は避けたいところですがまだいい方法見つかってません。
誰か解法かもん><
JavaScript 第6版
posted with amazlet at 13.06.20
David Flanagan
オライリージャパン
売り上げランキング: 5,670
オライリージャパン
売り上げランキング: 5,670