オブジェクトのキーと値を取得するためのより良い方法はありますか?私はfor
ループなしでこれを行おうとしています。
obj = { collection: 'foo' }
for key, value of obj
console.log key, value
オブジェクトに1つの値を持つ1つのキーがある場合、これを行うためのより効率的な方法があると思いました。私は間違っているかもしれません。
オブジェクトのキーと値を取得するためのより良い方法はありますか?私はfor
ループなしでこれを行おうとしています。
obj = { collection: 'foo' }
for key, value of obj
console.log key, value
オブジェクトに1つの値を持つ1つのキーがある場合、これを行うためのより効率的な方法があると思いました。私は間違っているかもしれません。
オブジェクトにキーが 1 つだけあるかどうかのみを確認したい場合は、短絡ループを使用できます。
exactly_one = (obj) ->
return false if(!obj)
how_many = 0
for own key of obj
break if(++how_many == 2)
how_many == 1
基本的な考え方は、for ... of
(つまり JavaScript のfor ... in
) ループを使用して、オブジェクト内のキーの数のカウントを開始することです。私たちが気にするのは、次の 3 つのケースだけです。
null
ません)。初期null
チェックとhow_many = 0
初期化でこれが処理されます。++how_many
一度離れるとヒットしhow_many == 1
ます。break
. 2 番目のキーに遭遇するとすぐに結果が得られることがわかっているfalse
ので、数え続ける必要はありません。これは、ループの最大 2 回の反復を行う機能になります。それはまだループですが、必要のないときにループ全体を強制的に実行するルールはありません。いつでもbreak
早期に終了できます。
デモ: http://jsfiddle.net/ambiguous/qsNMA/
ロジックを少し調整すると、「最大で 1 つ」、「少なくとも 1 つ」などになります。
C プログラマーとして生まれていない場合は、ロジックを少し展開できます。
for own key of obj
++how_many
break if(how_many == 2)
次のように書くこともできます。
(break if(++how_many == 2)) for own key of obj
しかし、それはIMOを推進しています。
プロトタイプから誤って何かを取得しないように、チェックをown
追加するだけです。hasOwnProperty
あなたはおそらくそれを必要としないでしょうが、彼らは本当に私を捕まえようとしているので、私は慎重に過ちを犯すことを好みます.
もありますObject.keys
が、それは普遍的にサポートされているわけではなく、長さが1になるかどうかだけを気にする場合は、配列全体を構築する必要があります:
exactly_one = (obj) ->
return false if(!obj)
Object.keys(obj).length == 1