我的代码
var arr = ['a','b',1];
var results = arr.map(function(item){
if(typeof item ==='string'){return item;}
});
这给出了以下结果
["a","b",undefined]
我不希望在结果数组中使用undefined。我怎么能这样做?
答案 0 :(得分:135)
如果该项不是字符串,则不返回任何内容。在这种情况下,函数返回undefined,您在结果中看到的内容。
map函数用于将一个值映射到另一个值,但看起来你实际上想要过滤数组,而map函数不适合。
您真正想要的是filter功能。它需要一个函数,根据您是否需要结果数组中的项目返回true或false。
var arr = ['a','b',1];
var results = arr.filter(function(item){
return typeof item ==='string';
});
答案 1 :(得分:13)
由于ES6 filter
支持尖箭头符号(如LINQ):
所以它可以归结为跟随单行。
['a','b',1].filter(item => typeof item ==='string');
答案 2 :(得分:12)
过滤器适用于未修改项目的特定情况。 但在许多情况下,当您使用地图时,您希望对传递的项目进行一些修改。
如果这是你的意图,你可以使用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
}, [])
答案 3 :(得分:8)
如果当前元素为string
,则只返回一个值。也许分配一个空字符串就足够了:
var arr = ['a','b',1];
var results = arr.map(function(item){
return (typeof item ==='string') ? item : '';
});
当然,如果要过滤任何非字符串元素,则不应使用map()
。相反,您应该考虑使用filter()
函数。
答案 4 :(得分:4)
var arr = ['a','b',1];
var results = arr.filter(function(item){
if(typeof item ==='string'){return item;}
});
答案 5 :(得分:4)
我的解决方案是在地图后使用过滤器。
这应该支持每种JS数据类型。
示例:
const noUndefinedList = someList
.map(// mapping condition)
.filter(notUndefined => notUndefined); // by doing this,
//you can ensure what's returned is not undefined
答案 6 :(得分:2)
如果必须使用 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']
答案 7 :(得分:1)
您可以像下面的逻辑一样实现。 假设您想要一个值数组。
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']
答案 8 :(得分: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;}
}
);