ど素人から毛を生やす。<延>

jsの連想配列をソートしたかった話。

Web > javascript 2019年12月25日(最終更新:2月前)

どもです。

jsで連想配列(オブジェクト)の値によるソートを行いたかったのですが、調べても調べても

let array = [
     { name:'aaa', value:1 }
     { name:'bbb', value:2 }
     { name:'ccc', value:3 }
 ];
 array.sort(function(a,b){
     return (a.value - b.value);
 });

みたいな、「連想配列の配列」のソートばかりが出てくるんですよ。

そうじゃなくて、PHPで言うなら

$array = array(
     'aaa' => 1,
     'bbb' => 2,
     'ccc' => 3,
);
asort($array);

こっちがやりたいんですね。

で、結論から言うと、これはできない。

正確には.prototype.sort=function(){}で独自のソート関数を作成すればできるっちゃのですが、jsファイル作るたびに都度にそんな面倒くさいこと、やってられない。連想配列自体の宣言も面倒になるし。

厳密にはjsに「連想配列」は無く、オブジェクトで代替しているために偶にこういう不便があるんですね。
連想配列をソートしたい場合、最初から配列を「連想配列の配列」で作ってしまうのが妥当のようです。

補足

ggると色々なソート関数があったのですが、検索上位が数値をソートする場合と文字列をソートする場合のどちらかしか対応できていなかったので両対応の比較関数を書いておきます。
ちなみに今のところ複数基準ソートには対応してないです。

function sortArray(array, key, order='asc'){
    array.sort(function(a,b){
        //nullは後ろに
        if (a[key] == null && b[key] == null) return 0;
        if (a[key] == null) return 1;
        if (b[key] == null) return -1;

        //数値か文字列か
        if(isFinite(a[key]) && isFinite(b[key])){
            //数値の場合
            c = a[key] - b[key];
        }else{
            //文字列の場合
            if(a[key] > b[key]){
                c = 1;
            }else if(a[key] < b[key]){
                c = -1;
            }
        }
        //ascなら昇順、descなら降順
        if(order!='asc'){
            c = c * -1;
        }
        return c;
    });
    return array;
}
この記事は役に立ちましたか?
  • _(:3」∠)_ 面白かった (0)
  • (・∀・) 参考になった (0)
  • (`・ω・´) 役に立った (0)