2017-02-02 1 views
-5

나는 다음과 같은 간단한 기능이 있습니다 배열의 각 요소를 통해 이동하도록되어지도 메서드가 배열을 변경하지 못하는 이유는 무엇입니까?

function shiftCase2(string) { 
    temp = string.split(''); 
    temp.map(function(x) { 
     if (x == x.toUpperCase()) { 
      x = x.toLowerCase(); 
     } 
     if (x == x.toLowerCase()) { 
      x = x.toUpperCase(); 
     } 
    }) 
    temp = temp.join(""); 
    console.log(temp); 
} 

를하고, 문자가 대문자 인 경우는 소문자와 그 반대로 변경합니다. 예를 들어 shiftCase2("TEST string to USE");은 나에게 "test STRING TO use"을 제공해야합니다.

나는 그것이 작동하지 않는 이유를 알 수없고 내 입력을 원래대로 되돌립니다.

+4

'.map()'새로운 배열을 만듭니다 – Satpal

+2

이걸위한 dupetarget이 있어야합니다 ... –

+0

'x'는 문자 (기본 유형)이므로 ** 참조에 의해 ** 값 **에 의해 전달됩니다 **. 게다가 이것은'map'의 유스 케이스가 아닙니다 ('map' 콜백은 결과로 새로운 배열에 저장 될 새로운 아이템을 리턴해야합니다). –

답변

5

.map()은 소위 순수 함수이다. 즉, 입력을 수정하지 않고 새로운 출력을 생성합니다.

당신은 이런 식으로 할 필요가 :

temp = temp.map(function(x) { 
    if (x == x.toUpperCase()) { 
     return x.toLowerCase(); 
    } 
    if (x == x.toLowerCase()) { 
     return x.toUpperCase(); 
    } 
}) 

나는 docs to learn how it works을 확인하는 것이 좋습니다.

+1

고마워,이 훨씬 더 잘 이해합니다. 혼란은 "Array.prototype.map()은 새로운 배열을 만듭니다"라는 오해에서 왔습니다. BTW. Stackoverflow는 새로운 멤버에게 매우 유독합니다. – Milan

+0

@ 밀란 : 유독? 방금 여러 사용자로부터 정보가 가득한 페이지를 받았습니다. –

+0

... 그리고 거의 5 년 동안 회원으로 활동 해 오셨습니다! –

0

.map()은 새 배열을 만듭니다. .map()에 전달하는 함수는 새 값을 반환해야합니다. 이것은 한 방법이다 : 배열은 수정되지 않습니다

temp = temp.map(function(x) { 
    if (x == x.toUpperCase()) { 
     x = x.toLowerCase(); 
    } 
    if (x == x.toLowerCase()) { 
     x = x.toUpperCase(); 
    } 
    return x; 
} 
+0

감사합니다. 매우 감사. – Milan

+0

지도의 전체적인 포인트는 새로운 배열을 반환하는 것입니다. 생성되는 새로운 변수의 이름을 'temp'에서 'swappedCase'또는 좀 더 기술적 인 것으로 변경하는 것이 더 좋습니다. – cs01

+0

일반적으로 그렇습니다. 그러나 원래의 목적은 임시 배열을 변경하는 것이 었습니다. – yadejo

-1

.map() 방법은, 그것은 새로운 하나를 반환합니다. 그러나 .forEach() 메서드는 예상 한 배열을 변경합니다.

코드 명확성 및 "기능 프로그래밍"팬은 코드를 더 잘 이해하기 위해 .map() 방법을 사용하는 것이 더 좋다고 말하면서 일반적으로 동의합니다. 그러나 성능이 큰 배열의 주요 관심사라면 forEach이 실제로 더 빠릅니다. 성능 비교에 대해서는 this link을 참조하십시오. 이 경우 .map()을 사용하는 것이 가장 좋습니다.

행운을 빈다.

+0

두 개의 기존 답변이 아직 표시되지 않았고 모호하지만 모든 문제를 다루지는 않는다는 새로운 정보는 추가하지 않습니다. – Li357

+0

실제로 @AndrewLi는 새로운 정보를 추가합니다. 다른 답변에는없는 .forEach() 메소드가 언급되어 있습니다. 그런데 시간 태그를 확인하면 다른 답변이 게시 된 것처럼이 대답을 입력하고있었습니다. 아마 당신은 도움이 되고자하는 사람에게 그렇게 겸손 해지기 전에 더 조심해야합니다. 댓글과 downvote 주셔서 감사합니다, 당신이 여기서 재배하고있어 멋진 문화. – cs01

+0

나는 혼란스러워하지 않으려 고합니다. 콘텐츠를 평가하고 사이트의 의도대로 사용하려고합니다. 내 의견은이 대답이 다소 모호하고 다른 사람들과 같이 설명이 없었기 때문에 유용하지 않다고 말하면서 내 의견을 반영하기 위해 내 표를 사용했습니다. 나는 또한 나쁜 조언을 주었다고 느꼈다. (반복되는 배열을 변형시키기 위해 forEach를 사용하지 마라. 새로운 정보를 추가하는 답으로 답을 편집하고 싶다면 투표를 재평가 해주십시오. – Li357

0

Array.prototype.map()은이 배열의 모든 요소에 제공된 함수 을 호출 한 새 배열을 만듭니다. Source.

기본적으로 .map()은 의도적으로 원래 입력을 수정하지 않습니다.

관련 문제