javascript で下記のような配列を逆順にする関数はありませんか?

無い場合は、おすすめコードを教えてください。
(ソートではありません、順序を逆にしたいのです)
(phpでいうarray_reverseと同じ結果を求めています)

hoge['aaa'] = 'あいうえお';
hoge['bbb'] = 'かきくけこ';
hoge['ccc'] = 'さしすせそ';

よろしくお願いします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2014/06/01 21:57:09
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:a-kuma3 No.2

回答回数4973ベストアンサー獲得回数2154

ポイント100pt

Array#reverse() は、連想配列 (文字列をキーにした配列) には効かないみたいです。
なので、こんな感じではどうでしょう。

function dump_array(a) {
    console.log("--------------------");
    for (var i in a) {
        console.log(i + " : " + a[i]);
    }
}

function reverse_array_ex(a) {
    var key = [];
    for (var i in a) {
        key.push(i);
    }
    key.reverse();
    var ret = [];
    for (var i in key) {
        ret[key[i]] = a[key[i]];
    }
    return ret;
}

var hoge = [];
hoge['aaa'] = 'あいうえお';
hoge['bbb'] = 'かきくけこ';
hoge['ccc'] = 'さしすせそ';
hoge['ddd'] = 'たちつてと';
hoge['eee'] = 'なにぬねの';

dump_array(hoge);

// Array#reverse() は、連想配列には効かない
hoge.reverse();
dump_array(hoge);

// key を逆順に並べなおして、新たに連想配列を作り直す
hoge = reverse_array_ex(hoge);
dump_array(hoge);
id:a-kuma3

しかしそのタイプミスでいくつかのサイトがあるのも不思議ですね ーー;

確かに。ググってみると、引っかかりますね。
迷ったときは、公式のサイトを当たるのが良いと思います(分かりにくいかもしれないですけど)。
Array - JavaScript | MDN
Array Object (JavaScript)

2014/06/01 22:12:56
id:worldtravel

ありがとうございます。

2014/06/01 22:48:26

その他の回答1件)

id:studiocherry No.1

回答回数283ベストアンサー獲得回数100

えーと、

hoge.reserve();

で、いいのかな。
(簡単すぎるから、なにか条件を忘れているかな?)

他4件のコメントを見る
id:worldtravel

やはりそうなのですね。
しかしそのタイプミスでいくつかのサイトがあるのも不思議ですね ーー;

2014/06/01 21:58:15
id:worldtravel

はじめて reserve() を見たときは、
まじめに、これは連想配列用なのかな?と信じて試しました ^^;

2014/06/01 21:59:35
id:a-kuma3 No.2

回答回数4973ベストアンサー獲得回数2154ここでベストアンサー

ポイント100pt

Array#reverse() は、連想配列 (文字列をキーにした配列) には効かないみたいです。
なので、こんな感じではどうでしょう。

function dump_array(a) {
    console.log("--------------------");
    for (var i in a) {
        console.log(i + " : " + a[i]);
    }
}

function reverse_array_ex(a) {
    var key = [];
    for (var i in a) {
        key.push(i);
    }
    key.reverse();
    var ret = [];
    for (var i in key) {
        ret[key[i]] = a[key[i]];
    }
    return ret;
}

var hoge = [];
hoge['aaa'] = 'あいうえお';
hoge['bbb'] = 'かきくけこ';
hoge['ccc'] = 'さしすせそ';
hoge['ddd'] = 'たちつてと';
hoge['eee'] = 'なにぬねの';

dump_array(hoge);

// Array#reverse() は、連想配列には効かない
hoge.reverse();
dump_array(hoge);

// key を逆順に並べなおして、新たに連想配列を作り直す
hoge = reverse_array_ex(hoge);
dump_array(hoge);
id:a-kuma3

しかしそのタイプミスでいくつかのサイトがあるのも不思議ですね ーー;

確かに。ググってみると、引っかかりますね。
迷ったときは、公式のサイトを当たるのが良いと思います(分かりにくいかもしれないですけど)。
Array - JavaScript | MDN
Array Object (JavaScript)

2014/06/01 22:12:56
id:worldtravel

ありがとうございます。

2014/06/01 22:48:26
  • id:language_and_engineering

    JavaScriptのfor in文には,順序の概念はありません。

    そのため,ブラウザごと・バージョンごとにfor inを動かしたときの動作順が異なったりします。(順序不定)


    PHPと異なり,JavaScriptの連想配列とfor in構文には順序の概念がないので注意すること
    http://d.hatena.ne.jp/TipsMemo+computer-technology/20140601/p1


    順序がないので,reverseもありません。PHPとだいぶ違います。

  • id:worldtravel
    げっ そうなんですか。
    ありがとうございます。

    とりあえず、firefoxでは動いているので安心しておりました。

    様子見てみます。
  • id:snow0214
    >順序がないので,reverseもありません
    これは半分間違っています。

    JavaScriptの連想配列は実はObject型であるため、
    Array型に対するメソッドである reverse が適用されません。

    正しくは
     var hoge = new Object();
    です。

    配列ではないので順序の概念がないというのが真相です。
    PHPは、添字が数字の配列も連想配列も同じ「配列」です。
  • id:language_and_engineering
    >snow0214さん

    補足ありがとうございます。私も同じ認識です。

    ということは,書き方がちょっと言葉足らずだったですかね。


    >順序がないので,reverseもありません

    ↓ちょっと修正しますね。

    >for in文は正式には順序を意識しないので,そこでreverseという操作を持ち出すこと自体が違っています。


    Objectには順序もreverseもなく,Arrayには順序とreverseがあります。

    for文は順序を意識するためreverse操作も有効ですが,for in文は順序やreverseの概念が通用しないとみなすべきです。

    これでOK

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません