자바 스크립트지도 함수가 정의되지 않은 것을 반환하는 이유는 무엇입니까?


114

내 코드

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

이것은 다음과 같은 결과를 제공합니다

["a","b",undefined]

결과 배열에서 undefined를 원하지 않습니다. 어떻게 할 수 있습니까?


3
문자열이 아니면 아무것도 반환하지 않기 때문입니다. 따라서 마지막 항목은를 반환합니다 undefined. 문자열이 아닌 경우 무엇을 반환 할 것으로 예상합니까? 빈 문자열?
BenM 2013-04-16

2
@BenM이 문자열이 아니면 아무것도 반환하지 않기를 원합니다.
Akshat Jiwan Sharma 2013

4
이 작업을 수행하는 데 잘못된 방법을 사용한 것 같습니다. 제안 된대로 필터를 사용하겠습니다.
Akshat Jiwan Sharma 2013

대답을 받아들이고 싶을 수도 있습니다.
Ikke 2013-04-16

3
jQuery.map은 실제로 결과 배열에 정의되지 않은 값과 null 값을 포함하지 않을만큼 똑똑합니다.
Donald Taylor

답변:


179

항목이 문자열이 아닌 경우 아무것도 반환하지 않습니다. 이 경우 함수는 결과에 표시되는 undefined를 반환합니다.

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

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

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

2
아 ... 필터 기능이 있는지 몰랐습니다. 감사합니다.
Akshat Jiwan Sharma 2013

이것은 꽤 의미가 있습니다. 나는 .map'ing이 아니었다 나는 .filter'ing이었다 ... 어떻게 알았어?! 됐지 감사합니다 ^. ^
DigitalDesignDj

매우 논리적 감사 @Ikke
말리크 칼릴

답을 찾기위한 노력을 절약했습니다. 감사.
Sophie Zhang

22

필터는 항목이 수정되지 않은 특정 경우에 작동합니다. 그러나 대부분의 경우 맵을 사용할 때 전달 된 항목을 수정하려고합니다.

그것이 당신의 의도라면 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
}, [])

1
감사합니다- map결과는 undefined. filter항목 만 반환하거나 반환하지 않습니다. 이 완벽
자크 스미스

15

ES6 filter는 LINQ와 같은 뾰족한 화살표 표기법을 지원 하므로 :

따라서 한 줄로 요약 할 수 있습니다.

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

10

내 해결책은지도 뒤에 필터를 사용하는 것입니다.

이것은 모든 JS 데이터 유형을 지원해야합니다.

예:

const notUndefined = anyValue => typeof anyValue !== 'undefined'    
const noUndefinedList = someList
          .map(// mapping condition)
          .filter(notUndefined); // by doing this, 
                      //you can ensure what's returned is not undefined

8

현재 요소가 인 경우에만 값을 반환합니다 string. 아마도 빈 문자열을 할당하면 충분합니다.

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

물론 문자열이 아닌 요소를 필터링하려면 map(). 오히려 filter()함수 사용을 살펴 봐야 합니다.


3
숫자가 있으면 빈 문자열을 반환합니다
Prasath K

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

2

아래 로직과 같이 구현할 수 있습니다. 값의 배열을 원한다고 가정하십시오.

let test = [ {name:'test',lastname:'kumar',age:30},
             {name:'test',lastname:'kumar',age:30},
             {name:'test3',lastname:'kumar',age:47},
             {name:'test',lastname:'kumar',age:28},
             {name:'test4',lastname:'kumar',age:30},
             {name:'test',lastname:'kumar',age:29}]

let result1 = test.map(element => 
              { 
                 if (element.age === 30) 
                 {
                    return element.lastname;
                 }
              }).filter(notUndefined => notUndefined !== undefined);

output : ['kumar','kumar','kumar']
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.