2012-11-14 1 views
0

루프 GET 반복자 VAR을위한 그러나이로 번역되어커피 스크립트 내가</p> <pre><code>arr = ["a","b","c"] for i in [0..arr.length] by 1 if (sometimesTrue) arr.pop() i-- </code></pre> <p>이 커피 스크립트에서

var arr, i, _i, _ref; 

arr = ["a", "b", "c"]; 

for (i = _i = 0, _ref = arr.length; _i <= _ref; i = _i += 1) { 
    if (sometimesTrue) { 
    arr.pop(); 
    i--; 
    } 
} 

은이 루프 i를 대신 참조로 _i을 사용하고 있음을 알 수있다 그래서 내 i-- 정말 아무것도하지 않습니다.

이 루프에서는 배열 길이가 바뀌기 때문에 이것을 처리하는 방법을 알아야합니다 ... for 루프를 사용하여이 작업을 수행 할 수있는 방법이 있습니까? 아니면 잠시 전환해야합니까?

+1

'sometimesTrue' 정말 무엇을 보는가 : 당신이 믿을 수없는 경우

arr = arr.filter((member) -> !sometimesTrue) 

, 당신은 유사한 커피 스크립트 구문을 사용할 수 많은 자바 스크립트 구현은 배열 프로토 타입에 부착 된 필터 기능이 처럼? 배열을 반복하면서 배열을 수정하는 것은 일반적으로 나쁜 생각입니다 (변경 사항을 고려하더라도). 반면 필터링을하는 동안 오류가 발생하지 않는 경향이 있습니다. 그리고'_ref'보다는'i'를 변경하고 싶습니까? –

+0

그것은 내가 쓰고있는 알고리즘의 일부입니다. 그렇습니다. 그런 식으로 할 수는 있지만, 저는 coffeescript의 반복문에 사용 된 반복자에 접근 할 수있을 것이라고 상상했습니다. – K2xL

+1

루프를 읽을 수 있습니다. 카운터 ('for e, iry in i')하지만 변경할 수는 없습니다. –

답변

2

CoffeeScript는 루프 경계를 한 번 계산하므로 계산을 재설정 할 수 없으므로 반복을 수행하는 동안 배열을 변경하면 큰 혼란이 발생합니다.

이 : _ref는 루프의 처음에 계산 될 때 반복 횟수는 고정된다

var i, _i, _ref; 
for (i = _i = 0, _ref = a.length; 0 <= _ref ? _i <= _ref : _i >= _ref; i = 0 <= _ref ? ++_i : --_i) { 
    f(i); 
} 

참고

f(i) for i in [0..a.length] 

이된다. 또한 각 반복마다 i에 새 값이 지정되므로 루프 내에서 i에 대한 모든 변경 사항이 무시됩니다. 그리고, [0..a.length] 이상의 루핑은 a.length+1 반복이 아니라, a.length 반복입니다. [a..b]은 닫힌 간격을 생성합니다 (예 : 양쪽 끝점 포함). [a...b]은 반 개방 간격을 제공합니다 (즉, b은 포함되지 않음). 마찬가지로,이 :

f(i) for i in a 

이된다 :

var i, _i, _len; 
for (_i = 0, _len = a.length; _i < _len; _i++) { 
    i = a[_i]; 
    f(i); 
} 

다시, 반복 횟수는 고정되고 변경 i 덮어 쓰기된다.

i = 0 
while i < arr.length 
    if(sometimesTrue) 
    arr.pop() 
    --i 
    ++i 

나 :

i = 0 
while i < arr.length 
    if(sometimesTrue) 
    arr.pop() 
    else 
    ++i 
-2

때로는 시가렛으로 집 앞에서 어쩌면 진짜 신선한 공기를 마시 며 걸을 수도 있습니다. (아내도 담배를 싫어할지도 모르지만 ...) 언젠가는 이야기하는 데 도움이됩니다. uber-geeks가 모니터에 가지고있는 고무 오리. 그리고 때로는 단순하고 사물을 다른 각도에서 공격하는 것이 간단하고 단순합니다. 편곡 = [ "A", "B", "C"]

for i in [0..arr.length] 
    if (sometimesTrue) 
    arr.splice i, 1 
    else i++ 

편집 : 내가 여기서 뭔가를 잃어버린 아래 코멘트에서 보는 바와 같이. 나는 정말로 무시 당하지 않는다. 어떻게 생각 했겠습니까?

+0

아 ... 나는 단지 당신이 스플 라이스가 필요 할지도 모른다고 생각했다. – Joehannes

+0

당신은 자바 스크립트를 보았는가? (js2coffe.org) 예쁘지 않습니다. – K2xL

+0

흠, 정확히 당신의 포인트 메이트를 볼 수 없습니다! 여기에있는 문제는 예쁘지는 않지만 기능적이었습니다. 게다가, 나는 js가 그 어떤 방법으로도 추악하지 않다고 생각하지만, 나는 coffeescript를 많이 사용하고 그것의 편집 된 것에 익숙해진다. 당신의 정보를 위해서 : coffeescript.org에는 "coffeescript"라고 쓰여진 라이브 컴파일러가 있습니다. 더 명확하게 말하면 : 나는 다음과 같이 질문을합니다. "나는 배열에서 i를 사용하고 싶습니다. for-loop에서 조작합니다. 따라서 _i가 도입 된 이후 루프에 의해 증가되지 않습니다. 제대로 사용할 수 없습니다 "... 따라서 else {++ – Joehannes

-1

어레이와 루프 내부의 루프 인덱스 어지하려면

다음은 while 루프를 사용하여 손으로 모든 것을 할 필요가 coffeescript에서 색인을 사용하는 것은 아주 부 자연스러운 일입니다.

내가 당신이 원하는 것은 같은 것이 있다고 생각 :

arr = ["a","b","c"] 
arr = (i for i in arr when ! sometimeTrue) 

난 당신이 거의 이상 반복하지하고있는 배열을 수정 http://coffeescript.org/

+0

컴파일 해보십시오. 배열 이해 구문이 예상 한대로 작동하지 않습니다. –

1

에서 다음 항목 "루프와 함축"를 읽어해야한다고 생각 for ... in ... 구문을 사용하여 원하는 언어로 작업을 수행 할 수 있습니다. 당신이 정말로 찾고있는 것은 filter입니다.

arr = (member for member in arr when !sometimesTrue) 
관련 문제