2013-04-16 219 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 
}, [])