167 votes

Pourquoi la fonction map de JavaScript retourne-t-elle indéfinie ?

Mon code

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

Cela donne les résultats suivants

["a","b",undefined]

Je ne veux pas undefined dans le tableau des résultats. Comment puis-je le faire ?

247voto

Ikke Points 31517

Vous ne retournez rien dans le cas où l'élément n'est pas une chaîne. Dans ce cas, la fonction renvoie undefined ce que vous voyez dans le résultat.

La fonction map est utilisée pour faire correspondre une valeur à une autre, mais il semble que vous souhaitiez en fait filtrer le tableau, ce pour quoi une fonction map n'est pas adaptée.

Ce que vous voulez en fait, c'est un filtre fonction. Elle prend une fonction qui renvoie vrai ou faux selon que vous voulez ou non l'élément dans le tableau résultant.

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

52voto

Nicola Pedretti Points 1657

Le filtre fonctionne pour ce cas spécifique où les éléments ne sont pas modifiés. Mais dans de nombreux cas, lorsque vous utilisez map, vous souhaitez apporter quelques modifications aux éléments transmis.

si c'est votre intention, vous pouvez utiliser réduire le site :

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
}, [])

21voto

LIUFA Points 3642

Depuis ES6 filter prend en charge la notation par flèche pointue (comme LINQ) :

On peut donc le résumer en une seule phrase.

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

19voto

Jojo Narte Points 604

Ma solution serait d'utiliser le filtre après la carte.

Cela devrait supporter tous les types de données JS.

exemple :

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

19voto

mkumar Points 131

Vous pouvez mettre en œuvre la logique ci-dessous. Supposons que vous voulez un tableau de valeurs.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X