我的代码
var arr = ['a','b',1];
var results = arr.map(function(item){
if(typeof item ==='string'){return item;}
});
这给出了以下结果
["a","b",undefined]
我不想undefined
在结果数组中。我该怎么做?
我的代码
var arr = ['a','b',1];
var results = arr.map(function(item){
if(typeof item ==='string'){return item;}
});
这给出了以下结果
["a","b",undefined]
我不想undefined
在结果数组中。我该怎么做?
如果项目不是字符串,您不会返回任何内容。在这种情况下,该函数将返回undefined
您在结果中看到的内容。
map 函数用于将一个值映射到另一个值,但看起来您实际上想要过滤数组,而 map 函数不适合这种情况。
你真正想要的是一个过滤功能。它需要一个函数,根据您是否想要结果数组中的项目返回 true 或 false。
var arr = ['a','b',1];
var results = arr.filter(function(item){
return typeof item ==='string';
});
过滤器适用于不修改项目的这种特定情况。但是在很多情况下,当您使用 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
}, [])
由于 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']