我的代码
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']
如果当前元素是 a ,则仅返回一个值string
。也许分配一个空字符串就足够了:
var arr = ['a','b',1];
var results = arr.map(function(item){
return (typeof item ==='string') ? item : '';
});
当然,如果你想过滤任何非字符串元素,你不应该使用map()
. 相反,您应该考虑使用该filter()
功能。
var arr = ['a','b',1];
var results = arr.filter(function(item){
if (typeof item ==='string') {return item;}
});
如果您必须使用 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']
如果你这样使用它,你的问题就会得到解决。此外,您将拥有一个干净而简短的代码
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;}
}
);