167 votos

¿Por qué la función de mapeo de JavaScript devuelve undefined?

Mi código

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

Esto da los siguientes resultados

["a","b",undefined]

No quiero undefined en el array de resultados. ¿Cómo puedo hacerlo?

247voto

Ikke Puntos 31517

No estás devolviendo nada en el caso de que el elemento no sea una cadena. En ese caso, la función devuelve undefined, lo que estás viendo en el resultado.

La función map se utiliza para mapear un valor a otro, pero parece que en realidad deseas filtrar la matriz, para lo cual una función de map no es adecuada.

Lo que realmente quieres es una función de filtro. Toma una función que devuelve verdadero o falso en función de si deseas el elemento en la matriz resultante o no.

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

53voto

Nicola Pedretti Puntos 1448

El filtro funciona para este caso específico donde los elementos no se modifican. Pero en muchos casos, cuando se usa map, se desea realizar alguna modificación a los elementos pasados.

Si ese es tu objetivo, puedes usar reduce:

var arr = ['a','b',1];
var results = arr.reduce((results, item) => {
    if (typeof item === 'string') results.push(modify(item)) // modify es una función ficticia que aplicaría algún cambio a los elementos en el array
    return results
}, [])

21voto

LIUFA Puntos 3642

Desde ES6 filter admite la notación de flecha puntiaguda (como LINQ):

Por lo que se puede reducir a la siguiente instrucción en una línea.

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

19voto

Jojo Narte Puntos 971

Mi solución sería usar filter después del map.

Esto debería soportar todos los tipos de datos de JS.

ejemplo:

const notUndefined = anyValue => typeof anyValue !== 'undefined'    
const noUndefinedList = someList
          .map(// condición de mapeo)
          .filter(notUndefined); // al hacer esto, 
                      //puedes asegurar que lo que se devuelve no es undefined

19voto

mkumar Puntos 131

Puedes implementar una lógica como la siguiente. Supongamos que quieres un array de valores.

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

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X