行動すれば次の現実

ほどよくモダンなシステム開発を目指しています。メインテーマは生産性、Ruby、Javascriptです。

RubyとJavascriptにおけるHashの順序保証の違い

RubyとJavascriptではHashの順序保証が言語のバージョンによって異なる。 昨今、バックエンドでRubyを利用し、フロントエンドはJavascriptという、いわゆるSPAで開発するケースが増えている。 RubyでHashを返して、JavascriptでHash(オブジェクトリテラル)をeachしながら順番に処理を行う場合は、そのギャップに注意が必要だ。

Ruby(v1.9以上)の場合、Hashの要素の順序が保証される。

h = { '1':'a', '2':'b', '4':'d', '3':'c' }
p h
{:"1"=>"a", :"2"=>"b", :"4"=>"d", :"3"=>"c"}


h.each do |k, v|
  p v
end

:”a"
:”b"
:”d"
:”c"

Javascriptの場合は順序が保証されない (ブラウザによって挙動が異なるが一律保証されないと思ったほうが懸命である)

const h = { 1:'a', 2:'b', 4:'d', 3:'c’ }
console.log(h)
{1: "a", 2: "b", 3: "c", 4: "d”}

Object.keys(h).forEach((k) => {
  console.log(k)
});
a
b
c
d

そのため、Javascriptで順序を保ちたい場合は、順序用のkey配列を別途用意する必要がある。

const h = {
  entities: { 1:'a', 2:'b', 4:'d', 3: 'c'},
  orders: [1,2,4,3]
}

h.orders.forEach((k) => {
  const v = h.entities[k];
  console.log(k)
});
a
b
d
c