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

내 코드

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

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

["a","b",undefined]

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



답변

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

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

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

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


답변

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

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


답변

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

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

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


답변

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

이것은 모든 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


답변

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

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

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


답변

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


답변

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

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']