Javascriptでオブジェクトが自動ソートされてしまう

オブジェクトの自動ソートを防ぐ

jsでmapやreduceなどのメソッドを使って新しいオブジェクトを作る場合に、オブジェクトのキー名が数値になっていると自動でオブジェクトがソートされてしまう現象があります。

たとえば下のコードのように、キー名を数値にしていると3, 1, 2の順番で定義されていたとしても、実際のオブジェクトは1, 2, 3と並び替えられたものになってしまいます。

let obj = {
  3: 'bird',
  1: 'dog',
  2: 'cat',
}

console.log(obj)	// {1: "dog", 2: "cat", 3: "bird"}

自動でソートされて都合がいい場合は問題ないのですが、意図的に順番を維持したいときには困ってしまいます。

キー名を文字列にすれば自動ソートされなくなる

自動ソートさせないためには、キー名を文字列にするしかなさそうです。

ただ、単にキー名をダブルクオートで囲うだけではソートされてしまいます。なので下記コードのように、何か文字列をくっつけてやれば自動ソートはされなくなります。

let obj = {
  '_3': 'bird',
  '_1': 'dog',
  '_2': 'cat',
}

console.log(obj)	// {_3: "bird", _1: "dog", _2: "cat"}

 

キー名に余分な文字がついてしまうのが難点ですが、私の場合はこれでも問題なかったのでこれで解決しています。

もしもっといいやり方をご存知の方があれば教えていただければと思います。

コメント