CoffeeScript에서 객체의 키와 값을 반복하는 방법은 무엇입니까?


190

객체 (일반 자바 스크립트 객체라고도하는 "연관 배열")가 있습니다.

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

obj다음과 같이 CoffeeScript를 사용하여 반복하고 싶습니다 .

# 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에서 어떻게 할 수 있습니까?


4
JavaScript / CoffeeScript의 "배열"은 숫자 인덱스와 length가장 높은 숫자 인덱스 (1 더하기)를 나타내는 속성을 가진 특수한 개체입니다 . 당신이 원하는 것은 "개체" obj = {}입니다. 배열은 객체이지만 예제에서 배열을 사용할 이유가 없습니다.
Trevor Burnham

1
좋은 지적 Trevor! 이와 관련하여 오해의 소지가 적거나 혼동되지 않도록 질문을 수정했습니다.
Per Lundberg

답변:


351

사용하십시오 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 of는 JavaScript로 컴파일됩니다 in. 혼동의 일반적인 지점이지만 in배열과 함께 사용하는 것이 매우 유용합니다. 나는 CoffeeScript 책 에서 이것에 대해 길게 이야기 합니다.
Trevor Burnham

3
다음 arr과 같이 초기화 arr = []하면 안됩니다 arr = {}. Javascript (및 Coffeescript)에서 배열에는 숫자 인덱스가 있습니다. 객체는 연관 배열 / dicts처럼 동작합니다.
Morgan Harris

고마워, 그것은 Trevor와 다른 사람들에 의해 이미 지적되었으며 내 대답은 원래 질문 코드를 지키고있었습니다. 어쨌든 명확성을 위해 일반 객체를 사용하도록 예제를 업데이트하겠습니다.
Nick

13
이 특정 예에서는 중요하지 않지만 for own key, value of objOP가 찾고있는 것에 더 가깝게 들립니다 .
Aaron Dufour

4

배열을 초기화하고 있지만 객체처럼 사용하고 있습니다 (js에는 "연관 배열"이 없습니다).

객체를 반복 할 때 다음과 같은 구문을 사용하십시오.

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

3
실제로 JS의 모든 객체는 연관 배열입니다 (일관된 키 순서). 따라서 jcmoney가 준 코드는 작동해야하지만 그 경우 []대신 사용할 이유가 없습니다 {}.
Trevor Burnham

jashkenas.github.com/coffee-script/#loopscoffeescript에 의해 생성 된 루프가 객체 멤버를 반복하지 않는 것처럼 보입니다.
kioopi

3

단선 루프로 사용할 수있는 배열 이해를 사용하는 숏 핸드 버전입니다.

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

배열 이해 :

"포괄 옵션은 선택적 가드 절과 현재 배열 인덱스의 값으로 for 루프를 대체하고 컴파일합니다. for 루프와 달리 배열 이해는 표현식이며 반환 및 할당 될 수 있습니다.", http://coffeescript.org/ # 루프


5
설명 해주십시오. 코드 스 니펫을 제공하는 것만으로는 충분하지 않습니다. stackoverflow는 "코드를 정의 해 보는"사이트가 아닙니다. 아이디어는 추상적 개념을 명확하게 해주면 다른 사람들이 더 많은 혜택을 볼 수 있다는 것입니다.
Eliran Malka

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 key, val of arr
  console.log key + ': ' + val

다음을 반환합니다.

Foo : Bar
Bar : Foo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.