141

我的代码

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

这给出了以下结果

["a","b",undefined]

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

4

9 回答 9

231

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

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

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

var arr = ['a','b',1];
var results = arr.filter(function(item){
    return typeof item ==='string';  
});
于 2013-04-16T12:28:11.807 回答
42

过滤器适用于未修改项目的特定情况。但在很多情况下,当您使用 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
}, [])
于 2017-12-07T17:03:36.723 回答
19

由于 ES6filter支持尖箭头表示法(如 LINQ):

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

['a','b',1].filter(item => typeof item ==='string');
于 2016-11-03T10:22:19.363 回答
16

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

这应该支持每种 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
于 2018-07-30T08:16:35.747 回答
12

您可以像下面的逻辑一样实现。假设您想要一个值数组。

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']
于 2019-08-08T07:19:35.263 回答
8

如果当前元素是 a ,则仅返回一个值string。也许分配一个空字符串就足够了:

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

当然,如果你想过滤任何非字符串元素,你不应该使用map(). 相反,您应该考虑使用该filter()功能。

于 2013-04-16T12:29:43.187 回答
6
var arr = ['a','b',1];
var results = arr.filter(function(item){
                if (typeof item ==='string') {return item;}  
               });
于 2013-04-16T12:30:46.820 回答
6

如果您必须使用 map 来返回自定义输出,您仍然可以将其与 filter 结合使用。

const arr = ['a','b',1]

const result = arr.map(element => {

  if(typeof element === 'string')
    return element + ' something'

}).filter(Boolean) // this will filter out null and undefined

console.log(result) // output: ['a something', 'b something']
于 2021-03-17T15:11:45.217 回答
1

如果你这样使用它,你的问题就会得到解决。此外,您将拥有一个干净而简短的代码

var _ = require('lodash'); //but first, npm i lodash --save
var arr = ['a','b',1];
var results = _.compact(
    _.map(arr, function(item){
        if(_.isString(item)){return item;}
    }
); //false, null, undefined ... etc will not be included

用 ES6...

const _ = require('lodash'); //but first, npm i lodash --save
const arr = ['a','b',1];
const results = _.compact(
    _.map(arr, item => {
        if(_.isString(item)){return item;}
    }
);
于 2021-05-10T21:59:40.140 回答