2017-10-08 1 views
1

MEAN 스택 프로젝트의 일부로 Node.JS의 사전 객체로 작업하는 동안 이상한 동작이 발생했습니다.자바 스크립트 사전 키가 조건문 내에 있습니다.

keywordSearches 사전을 코드에 정의하고 searcheskeyword 속성을 포함하는 Search 개체의 배열입니다. 필자는 기본적으로 MongoDB에서 내 모든 검색 요청 레코드를 가져온 다음 키가 검색 텍스트이고 키워드 검색 빈도가 포함 된 사전을 만들고 값은 검색되는 빈도 (정수)입니다. . 이 모든 것은 keywordSearches에 저장됩니다.

그러나 다음 코드를 사용하여 검색을 반복 할 때 keywordSearches 키워드는 my if 조건 외부에서 false로 평가되지만 if 조건 (매우 다음 행)에서 true로 평가됩니다. . 이것은 왜 발생 하는가?

console.log(keywordSearches); 
    for (var i = 0; i < searches.length; i++){ 
    var keywords = searches[i].searchBody.keywords; 
    console.log(keywords in keywordSearches); // <- this evaluates to false 
    if (!keywords in keywordSearches){ // <- this section of code never executes! Why? 
     console.log("New keyword found") 
     keywordSearches[keywords] = 1; 
    } else { 
     keywordSearches[keywords] = keywordSearches[keywords] + 1; 
     console.log("else statement") 
    } 
    } 
    console.log(keywordSearches); 

출력 (주, 나는 키워드 "사진"네 개의 Search 객체 모두를 가지고 :

{} <- console.log(keywordSearches) 
false <- (keywords in keyWord Searches) 
else statement <- if condition evaluates to false! Should evaluate to true. Why? 
true 
else statement 
true 
else statement 
true 
else statement 
true 
else statement 
{ photography: NaN } 

내가 photographyNaN 이유를 이해한다. 그것은 1의 값으로 초기화 결코 (처음에 사전에없는 경우 해당 단어가 포함되어야 함). 따라서 매번 NaN +1이 추가됩니다.

+0

이것은 운영자 우선 순위 문제 일 수 있습니다. if 문에 괄호를 추가하십시오! (키워드는 keywodSearches에 있음) – doze

답변

2

in!보다 낮은 우선 순위를 가지고, 그래서 당신의 발현으로 평가된다

(!keywords) in keywordSearches 

대신 :

!(keywords in keywordSearches) 

참조 : 피가 if-else 문을 완전히 !을 사용하고 전환 MDN

Operator precedence
0

대신 :

console.log(keywordSearches); 
for (var i = 0; i < searches.length; i++){ 
var keywords = searches[i].searchBody.keywords; 
console.log(keywords in keywordSearches); // <- this evaluates to false 
if (keywords in keywordSearches){ 
    keywordSearches[keywords] = keywordSearches[keywords] + 1; 
    console.log("keyword already exists") 
} else { 
    console.log("New keyword found") 
    keywordSearches[keywords] = 1; 
} 
} 
console.log(keywordSearches); 

이것은 작업을 저장합니다.

+0

이 대답은 주어진 코드가 * 작동하지 * 않는 이유가 부족합니다. 예, 지점을 바꾸는 것은 올바른 기능으로 연결되지만 다른 대답이 지적한대로 문제의 핵심은 예상대로 작동하지 않는 상태에 관한 것입니다. – mhoff

관련 문제