我的代碼爲什麼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我能做到這一點不確定?
我的代碼爲什麼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我能做到這一點不確定?
如果項目不是字符串,則不返回任何內容。在這種情況下,函數返回undefined,你在結果中看到了什麼。
映射函數用於將一個值映射到另一個值,但它看起來實際上是要過濾該映射函數不適合的數組。
你真正想要的是一個filter函數。它需要一個函數,根據是否需要結果數組中的項來返回true或false。
var arr = ['a','b',1];
var results = arr.filter(function(item){
return typeof item ==='string';
});
啊......我不知道有一個過濾功能。謝謝。 –
這很有意義。我沒有.map'我是.filter'ing ...你怎麼知道的?! O.o Thanks ^。^ – DigitalDesignDj
非常符合邏輯謝謝@Ikke –
var arr = ['a','b',1];
var results = arr.filter(function(item){
if(typeof item ==='string'){return item;}
});
由於ES6 filter
支持尖箭頭符號(如LINQ):
所以可以歸結爲下列單行。
['a','b',1].filter(item => 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
}, [])
因爲你,除非它是一個字符串不返回任何東西。因此,最後一項返回'undefined'。如果不是字符串,你希望返回什麼?一個空字符串? – BenM
@BenM如果它不是一個字符串我不想返回任何東西,甚至沒有定義。 –
看起來像我使用錯誤的方法來做到這一點。我將按照建議使用過濾器。 –