为什么 JavaScript map 函数返回 undefined?

IT技术 javascript
2021-01-19 19:55:24

我的代码

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

这给出了以下结果

["a","b",undefined]

我不想undefined在结果数组中。我该怎么做?

6个回答

如果项目不是字符串,您不会返回任何内容。在这种情况下,该函数将返回undefined您在结果中看到的内容。

map 函数用于将一个值映射到另一个值,但看起来您实际上想要过滤数组,而 map 函数不适合这种情况。

你真正想要的是一个过滤功能。它需要一个函数,根据您是否想要结果数组中的项目返回 true 或 false。

var arr = ['a','b',1];
var results = arr.filter(function(item){
    return typeof item ==='string';  
});
这有点意思。我不是 .map'ing 我是 .filter'ing...你怎么知道的?!哦谢谢^.^
2021-03-20 19:55:24

过滤器适用于不修改项目的这种特定情况。但是在很多情况下,当您使用 map 时,您希望对传递的项目进行一些修改。

如果这是您的意图,您可以使用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
}, [])
谢谢 -map结果是带有undefined. filter只返回项目与否。太棒了
2021-03-31 19:55:24

由于 ES6filter支持尖箭头符号(如 LINQ):

所以它可以归结为以下单行。

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

我的解决方案是在地图后使用过滤器。

这应该支持每种 JS 数据类型。

例子:

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

您可以实现如下逻辑。假设您想要一个值数组。

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