2013-02-21 2 views
0

return 함수에서 매우 단순한 논리를 가졌지 만 예상대로 작동하지 않습니다. 물론 코드를 약간 길게 만들고 문제를 해결할 수는 있지만 가능한 한 작게하고 싶습니다. 보시다시피이 #mainContent에서 #pageTitle을 발견하면Coffeescript 3 진 if 문이 틀린 논리

#Return title if exists or false otherwise 
getPageTitleFromMainContent = (mainContent) -> 
    mainContent.find('#pageTitle') ?.length ?= false 

if y = (getPageTitleFromMainContent $("#mainContent")) 
    y.css color:red 

, 그것이 빨간색해야한다 :

여기 내 코드입니다. 그러나 함수가 발견되면 #pageTitle을 반환하지 않고 .length를 반환합니다.

var getPageTitleFromMainContent, y; 

getPageTitleFromMainContent = function(mainContent) { 
    var _ref, _ref1; 
    return (_ref = mainContent.find('#pageTitle')) != null ? (_ref1 = _ref.length) != null ? **_ref1 : _ref.length = false : void 0;** 
}; 

if (y = getPageTitleFromMainContent($("#mainContent"))) { 
    y.css({ 
    color: red 
    }); 
} 

그리고 그것은 _ref : _ref.length = false : void 0;하지 _ref**1** : _ref.length = false : void 0;해야한다 : js2coffee.org에서

나는 코드로 컴파일되는 것을 알 수있다.

http://jsfiddle.net/X8VjJ/1/

감사합니다!

답변

2

코드가 맞는지 확실하지 않습니다. 길이가 정의되지 않은 한 효과적으로 길이 속성을 할당하려고합니다. 정의 된 경우 length 속성을 반환하기 만하면됩니다. 코드와 동작이 올바른 것처럼 보이지만 실존 연산자와 반환 값에 대한 이해가 잘못되었습니다. 발견 된 요소를 리턴하려면 길이 점검과의 연결을 끊어야합니다.

아마 뭔가 같은 : 이안은 자신의 더 우아한 답변에서 설명하고있는 바와 같이

getPageTitleFromMainContent = (mainContent) -> 
    arr = mainContent.find('#pageTitle') 
    if arr.length then arr else false 

, 당신은 (항상 요소의 배열 때문에, 편곡 (가정 JQuery와)의 존재 연산자를 사용할 필요가 없습니다 발견되지 않으면 길이가 0입니다). 이후

$('#mainContent #pageTitle').css(color: 'red') 

, 그것은 이되지 않는 경우는 #mainContent에서 #pageTitle을 발견하면

+0

요소가 존재하지 않으면 jquery는 빈 배열을 반환하고 싶지 않습니다. 거짓으로 돌아 가기를 원해. 또한, 내가 말했듯이, 값을 할당하지 않고 그것을 만드는 것이 좋을 것입니다. coffeescript는 매우 강력하며 그것을 사용하고 싶습니다. – ioanb7

+0

제안 된 솔루션으로 내 대답을 업데이트했습니다. –

3

, 그것은 당신이 훨씬 간단하여이 작업을 수행 할 수

빨간색해야한다 #mainContent#pageTitle을 찾으면 빈 요소 집합 인 no-op를 변경하려고 시도합니다.

제시 한 코드는 실제로 의미가 없습니다. ?.은 불필요합니다. 일치하지 않으면 null 또는 undefined을 반환하지 않습니다. 빈 요소 집합을 반환합니다. 항상 length을 반환 할 것이므로 length에 따라 null 또는 undefined을 반환하므로 할당이 실행되지 않습니다. 어느 것이 좋을까요? 아마도 요소의 길이를 false으로 설정하고 싶지 않을 것입니다.

마지막으로, 이것은 3 진 if 문이 아닙니다. CoffeeScript의 삼항 if 문은 다음과 같습니다 : if foo then bar else baz.

+0

실제 코드는 색상을 변경하는 것만 큼 간단하지 않습니다. 이는 단지 예일뿐입니다. 지글 거리는 리턴 값에 대한 논리는 옳습니다. 그러나 Marie Kjeldahl의 코드가 "el"과 같은 변수를 사용하지 않고 수행하는 방법은 없습니까? – ioanb7

+1

제 말은 검색을 두 번 할 수 있다는 것입니다. mainContent.find ('# pageTitle'). 길이> 0이면 mainContent.find ('# pageTitle') else false' 또는'mainContent.find ('# pageTitle')와 같이 끔찍한 것. length && mainContent.find (' '#page 제목')'. 그것은 더 나쁘다. 가능한 가장 읽기 쉬운 코드를 작성하십시오. 단일 표현식으로 압축하면 아무런 이점이 없으며 앞으로 코드를 이해하기가 더 어려워 질 것입니다. –

+0

오른쪽. 나는이 작은 문제를 해결할 수있는 모든 가능성을 시도했다고 생각합니다. '_ref'는'# mainContent'를 가져 오지만'coffeescript'는'.length? '를 볼 때'_ref' 변수를 연산자를 통해 반환 할 수 없으며 길이 인'_ref1'을 반환합니다. 나는이 질문을 조금 대답하지 않을 것이다. 그냥 뛰어 다니고. – ioanb7