为什么JavaScript的map函数会返回undefined?

167

我的代码

 var arr = ['a','b',1];
 var results = arr.map(function(item){
                if(typeof item ==='string'){return item;}  
               });
这将产生以下结果。
["a","b",undefined]

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


5
因为你只会返回字符串类型的内容,所以最后一项返回的是 undefined。如果不是一个字符串类型的内容,你希望返回什么?是一个空字符串吗? - BenM
3
如果它不是字符串,我不想返回任何东西。甚至不返回undefined。 - Akshat Jiwan Sharma
7
看起来我之前使用了错误的方法来做这件事。我会像建议的那样使用过滤器。 - Akshat Jiwan Sharma
4
jQuery.map 实际上足够聪明,不会在生成的数组中包括 undefined 和 null 值。 - Donald T
@JackB 哦,这是一个不错的发现。我会查看他们在源代码中如何实现它。谢谢。 - Akshat Jiwan Sharma
1
@DonaldTaylor 在这种情况下,更清晰的做法是使用过滤器方法来实现你想要的目标,即过滤掉元素,而不是将一个值映射到另一个值。 - Ikke
13个回答

0
如果您按照这种方式使用它,您的问题将会得到解决。 此外,您将拥有干净简洁的代码。
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;}
    }
);

0

您可以使用下面的示例代码轻松地使用 .map 过滤记录

const datapoints = [
    {
        PL_STATUS: 'Packetloss',
        inner_outerx: 'INNER',
        KPI_PL: '97.9619'
    },
    {
        PL_STATUS: 'Packetloss',
        inner_outerx: 'OUTER',
        KPI_PL: '98.4621',
    },
    {
        PL_STATUS: 'Packetloss',
        inner_outerx: 'INNER',
        KPI_PL: '97.8770',
    },
    {
        PL_STATUS: 'Packetloss',
        inner_outerx: 'OUTER',
        KPI_PL: '97.5674',

    },
    {
        PL_STATUS: 'Packetloss',
        inner_outerx: 'INNER',
        KPI_PL: '98.7150',
    },
    {
        PL_STATUS: 'Packetloss',
        inner_outerx: 'OUTER',
        KPI_PL: '98.8969'
    }
];
const kpi_packetloss_inner: string[] = [];
datapoints.map((item: { PL_STATUS: string; inner_outerx: string; KPI_PL: string }) => {
    if (item.PL_STATUS === 'Packetloss' && item.inner_outerx === 'INNER') {
        kpi_packetloss_inner.push(item.KPI_PL);
    }
})
console.log(kpi_packetloss_inner);

这个问题是9年前就被提出来了,并且已经有一个被接受的答案。请在添加新答案时添加一些关于原因的细节。 - MD Zand
这个问题被标记为另一个问题的重复,所以我在这里添加了我的答案。 - Mukesh Soni

0

当你想从原始数组生成新的修改后的数组时,可以使用Map。 对于某些人来说,简单的答案可能是这样的

      var arr = ['a','b',1];
      var results = arr.filter(function(item){
      // Modify your original array here
     return typeof item ==='string';  
     }).filter(a => a);

这不仅仅是一个复制了9年前的被赞同的答案吗?如果不是,请考虑添加一些解释,说明它与现有答案的区别在哪里,以及它为什么更好。 - chrslg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接