2013-04-16 221 views
56

我的代码为什么javascript map函数返回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,你在结果中看到了什么。

映射函数用于将一个值映射到另一个值,但它看起来实际上是要过滤该映射函数不适合的数组。

你真正想要的是一个filter函数。它需要一个函数,根据是否需要结果数组中的项来返回true或false。

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

啊......我不知道有一个过滤功能。谢谢。 –

+0

这很有意义。我没有.map'我是.filter'ing ...你怎么知道的?! O.o Thanks ^。^ – DigitalDesignDj

+0

非常符合逻辑谢谢@Ikke –

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