JavaScriptオブジェクトは値でソートできる?

投稿者: Anonymous

JavaScriptオブジェクトは、仕様ではキーの順序を保証しなかったと思うのですが、値だとどうなるのですか?

・下記で試してみた限りは期待した結果を得られたのですが、仕様的には問題ないですか?
・下記は、そもそも配列をソートしているだけなので、オブジェクトの順序とは無関係??

let hoge = [
    {a: "あ", b: 1},
    {a: "い", b: 2}
];
hoge.sort(function(value1, value2) {
    return value2.b - value1.b;
});

解決

・下記は、そもそも配列をソートしているだけなので、オブジェクトの順序とは無関係??

そう思います。配列を各要素.bでソートしているだけです。

仕様ではキーの順序を保証しなかったと思うのですが、値だとどうなるのですか?

上記の意味があまり理解できていませんが、
オブジェクトのキー一覧やオブジェクトの値一覧は以下のように取得でき、
MDNによると、いずれもfor...in ループによる順序と同じで、順不同(注)となるようです。

Object.keys(hoge[0])   //=> [ 'a', 'b' ]
Object.values(hoge[0]) //=> [ 'い', 2 ]

注) 順不同について

Javascriptにおけるオブジェクトの順序に検証された記事があります。
JavaScriptのエンジンにより挙動が違うようです。詳細は前述の記事などを参照ください。

以下はnodejs(v9.3.0)での実行例です。

obj = {a: "あ", b: 1}
console.log(Object.keys(obj)) //=> ['a', 'b']

obj.d = 2
obj.c = 3
console.log(Object.keys(obj)) //=> [ 'a', 'b', 'd', 'c' ]

obj[2] = "a"
obj[1] = "b"
console.log(Object.keys(obj)) //=> [ '1', '2', 'a', 'b', 'd', 'c' ]
回答者: user28902

Leave a Reply

Your email address will not be published. Required fields are marked *