2013-04-16 3 views
56

내 코드왜 javascript 맵 함수가 undefined를 반환합니까?

var arr = ['a','b',1]; 
var results = arr.map(function(item){ 
       if(typeof item ==='string'){return item;} 
       }); 

이 다음과 같은 결과

["a","b",undefined] 

내가 그것을 할 수있는 결과 array.How에서 정의하지 않으을 준다?

+3

그것을 문자열 않는 한 당신은 아무것도 반환하지 않기 때문에. 따라서 마지막 항목은'undefined'를 반환합니다. 문자열이 아니라면 무엇을 반환 할 것으로 예상합니까? 빈 문자열? – BenM

+0

@BenM이 문자열이 아니면 반환하지 않습니다. 정의되지 않았습니다. –

+3

잘못된 방법으로이 작업을 수행 한 것처럼 보입니다. 제안 된대로 필터를 사용합니다. –

답변

105

항목이 문자열이 아닌 경우 아무 것도 반환하지 않습니다. 이 경우 함수는 undefined를 반환하고 결과에서 무엇을 보게됩니다.

map 함수는 한 값을 다른 값으로 매핑하는 데 사용되지만 맵 함수가 적합하지 않은 배열을 실제로 필터링하려고합니다.

실제로 원하는 것은 filter 기능입니다. 결과 배열에 항목을 표시할지 여부에 따라 true 또는 false를 반환하는 함수를 사용합니다.

var arr = ['a','b',1]; 
var results = arr.filter(function(item){ 
    return typeof item ==='string'; 
}); 
+0

아 ... 필터 기능이 있다는 것을 몰랐습니다. 감사합니다. –

+0

이것은 꽤 의미가 있습니다. 나는. 내가 있었던 .map'ing was not .filtering ... 당신은 어떻게 알았 느냐?! 감사합니다 ^.^ – DigitalDesignDj

+0

매우 논리적 인 감사합니다. @Ike –

8

현재 요소가 string 인 경우에만 값을 반환합니다. 아마도 충분 그렇지 않으면 빈 문자열을 할당 : 물론

var arr = ['a','b',1]; 
var results = arr.map(function(item){ 
    return (typeof item ==='string') ? item : ''; 
}); 

, 당신은 어떤 문자열이 아닌 요소를 필터링하려면, 당신은 map()을 사용할 수 없습니다. 오히려 filter() 기능을 사용해보아야합니다.

+1

숫자가있는 경우 빈 문자열을 반환합니다. –

+3

예, 알고 있습니다 ... – BenM

4
var arr = ['a','b',1]; 
var results = arr.filter(function(item){ 
       if(typeof item ==='string'){return item;} 
       }); 
8

ES6 filter은 (LINQ 등) 뾰족한 화살표 표기 지원하므로 :

그래서이 한 줄에 따라 아래로 비등 될 수있다.

['a','b',1].filter(item => typeof item ==='string'); 
1

필터는 항목이 수정되지 않은이 특별한 경우에 적용됩니다. 그러나 많은 경우에 맵을 사용할 때 전달 된 항목을 약간 수정하려고합니다. 그 의도 인 경우

, 당신은 reduce를 사용할 수 있습니다

var arr = ['a','b',1]; 
var results = arr.reduce((results, item) => { 
    if (typeof item === 'string') results.push(modify(item)) // modify is a fictitious function that would apply some change to the items in the array 
    return results 
}, []) 
관련 문제