46657


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

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

[code]

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


CC BY-SA 4.0
2018-07-16T13:16:54.783
46656
2018-07-16T14:58:19.540
7886
question
javascript
JavaScriptオブジェクトは値でソートできる？


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

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

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

上記の意味があまり理解できていませんが、  
オブジェクトのキー一覧やオブジェクトの値一覧は以下のように取得でき、  
[MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/values)によると、いずれも`for...in`
ループによる順序と同じで、順不同(注)となるようです。

[code]

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

### 注) 順不同について

[Javascriptにおけるオブジェクトの順序](https://qiita.com/suguru03/items/bf48610225fefcb0f45e)に検証された記事があります。  
JavaScriptのエンジンにより挙動が違うようです。詳細は前述の記事などを参照ください。

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

[code]

    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' ]
    
[/code]


CC BY-SA 4.0
2018-07-16T13:47:58.520
46657
2018-07-16T14:58:19.540
2018-07-16T14:58:19.540
46656
answer