CoffeeScriptのオブジェクトのキーと値を反復する方法は?


189

私はオブジェクト(いわば「関連付け配列」-プレーンJavaScriptオブジェクトとも呼ばれます)を持っています。

obj = {}
obj["Foo"] = "Bar"
obj["bar"] = "Foo"

obj次のようにCoffeeScript を繰り返し使用したいと思います。

# CS
for elem in obj

上記のCSコードはJSにコンパイルされます。

// JS
for (i = 0, len = obj.length; i < len; i++)

この場合、これは適切ではありません。


JavaScriptの方法はそうでしょうがfor(var key in obj)、今は疑問に思っています。CoffeeScriptでこれを行うにはどうすればよいですか?


4
JavaScript / CoffeeScriptの「配列」は、数値インデックスとlength、最高の数値インデックス(プラス1)を単に参照するプロパティを持つ特別なオブジェクトです。必要なのは単なる「オブジェクト」ですobj = {}。配列はオブジェクトですが、例で使用する理由はありません。
Trevor Burnham

1
良い点トレバー!この点に関して、誤解を招く/混乱を少なくするために質問を変更しました。
ルンドバーグあたり

回答:


350

を使用しfor x,y of Lます。関連ドキュメント

ages = {}
ages["jim"] = 12
ages["john"] = 7

for k,v of ages
  console.log k + " is " + v

アウトプット

jim is 12
john is 7

for own k,v of agesコメントでAaron Dufourによって言及されたバリアントを検討することもできます。これにより、プロトタイプから継承されたプロパティを除外するチェックが追加されます。これは、この例ではおそらく問題ではありませんが、他のものの上に構築している場合は問題になる可能性があります。


12
正確に。CoffeeScriptはofJavaScriptにコンパイルされますin。これは一般的な混乱のポイントですがin、配列で使用することは非常に便利です。これについては、CoffeeScriptの本で詳しく説明しています。
Trevor Burnham

3
arrとして初期化しないarr = []でくださいarr = {}。使用する必要があります。JavaScript(およびCoffeescript)では、配列には数値インデックスがあります。オブジェクトは連想配列/辞書のように動作します。
モーガンハリス

ありがとう、それはTrevorや他の人たちによってすでに指摘されており、私の答えは元の質問コードを守ることでした。とにかくわかりやすくするために、プレーンオブジェクトを使用するようにサンプルを更新します。
Nick

13
この特定の例では問題ではありませんが、for own key, value of objOPが求めているものに近いように思えます。
アーロンデュフォー2013年

4

配列を初期化していますが、それをオブジェクトのように使用しています(jsには「連想配列」はありません)。

オブジェクトを反復するための構文を使用します(次のようなもの):

for key, val of arr
  console.log key + ': ' + val 

3
実際、JS内のすべてのオブジェクトは連想配列です(一貫したキーの順序付けはありません)。したがって、jcmoneyが提供したコードは機能するはずですが、その場合の[]代わりに使用する理由はありません{}
Trevor Burnham

jashkenas.github.com/coffee-script/#loopsは、coffeescriptによって生成されたループがオブジェクトメンバーを反復しないように見えます。
kioopi

3

1行ループとして使用できる配列内包表記を使用した簡略版。

console.log index + ": " + elm for index, elm of array

配列内包は次のとおりです。

「内包表記は、オプションのガード句と現在の配列インデックスの値を使用してforループを置換(およびコンパイル)します。forループとは異なり、配列内包表記は式であり、返して代入することができます。」、 http://coffeescript.org/ #ループ


5
説明してください。コードスニペットを提供するだけでは十分ではありません。stackoverflowは「gimme the codez」サイトではありません。答えが抽象的な概念の明確化を提供する場合、他の人がより多くの利益を得るという考えです。
Eliran Malka 2012

1

慣例では、arrは配列ですが、「foo」はこの配列のプロパティであり、インデックス付きの値ではありません。データに配列のインデックス付きの値を格納する場合は、次のように記述しておく必要があります。

arr1 = []
arr1[0] = "Bar"
arr1[1] = "Foo"

または、連想配列が必要な場合は、オブジェクトを使用するだけです。

arr2 = {}
arr2["Foo"] = "Bar" // equivalent to arr2.foo="Bar"
arr2["bar"] = "Foo" // equivalent to arr2.bar="Foo"

arr1をループしたい場合:

str = "values are : "
for val in arr2
  str += val + " |"
console.log key + ': ' + val

戻り値 :

values are : Bar | Foo |

そしてarr2をループする: "for value in array"

for key, val of arr
  console.log key + ': ' + val

を返す:

Foo : Bar
Bar : Foo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.