web-dev-qa-db-ja.com

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

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

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

次のようにCoffeeScriptを使用してobjを反復処理します。

# CS
for elem in obj

bu上記のCSコードをJSにコンパイルします。

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

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


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

186
jhchen

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

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

347
Nick

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

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

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

1行のループとして使用できる配列内包表記を使用したショートハンドバージョン。

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

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

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

2
sqren

慣例では、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
1
Benibur