3

オブジェクトのキーと値を取得するためのより良い方法はありますか?私はforループなしでこれを行おうとしています。

obj = { collection: 'foo' }

for key, value of obj
  console.log key, value

オブジェクトに1つの値を持つ1つのキーがある場合、これを行うためのより効率的な方法があると思いました。私は間違っているかもしれません。

4

1 に答える 1

2

オブジェクトにキーが 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 つのケースだけです。

  1. キーは 1 つ未満です (つまり、キーがありnullません)。初期nullチェックとhow_many = 0初期化でこれが処理されます。
  2. キーは正確に 1 つです。この場合、ループは 1 回のパスを作成し、++how_many一度離れるとヒットしhow_many == 1ます。
  3. 複数のキーがあります。この場合、ループは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

デモ: http://jsfiddle.net/ambiguous/aH8wA/

于 2012-06-07T02:44:18.110 に答える