["a", undefined, "c"].map((x)=>{return x})
// this is the console output --> ["a", undefined, "c"]
["a", undefined, "c"].map((x)=>{return typeof(x)})
// this is the console output --> ["string", "undefined", "string"]
["a", undefined, "c"].map((x)=>{if(typeof(x)=='string'){return x}})
// this is the console output --> ["a", undefined, "c"]
我想知道,为什么即使在if(typeof(x)=='string')
检查后仍未删除未定义的内容。迷茫?
答案 0 :(得分:6)
您可以将Array#filter
与Boolean
一起用作truthy值的回调。
console.log(["a", undefined, "c"].filter(Boolean));

为了保留字符串,您可以返回类型检查。
console.log(["a", undefined, "c", 42, ""].filter(s => typeof s === 'string'));

ES5
console.log(["a", undefined, "c", 42, ""].filter(function (s) {
return typeof s === 'string';
}));

答案 1 :(得分:4)
map
没有过滤。 map
地图。要进行过滤,请使用filter
:回调的返回值用于确定是否保留该条目。如果你只想保留字符串:
const result = ["a", undefined, "c"].filter(x => typeof x === "string");
const result = ["a", undefined, "c"].filter(x => typeof x === "string");
console.log(result);

如果您明确要删除undefined
:
const result = ["a", undefined, "c"].filter(x => x !== undefined);
const result = ["a", undefined, "c"].filter(x => x !== undefined);
console.log(result);

答案 2 :(得分:-1)
使用.filter
代替.map
。
还阅读了map
var output = ["a", undefined, "c"].filter((x)=>{if(typeof(x)=='string'){return x}});
console.log(output);
答案 3 :(得分:-1)
map遍历给定数组并返回一个新数组,其中包含输入的每个项目的一个新项目。
所以你的构造if(typeof(x)=='string'){return x}
,因为它是map
的一部分,实际上总是返回一些东西 - 默认情况下是从输入数组中获取的值。
你可以看到,如果你添加一个else
个案例,那么"值不是一个字符串"。但是,您无法使用map减少生成的数组中的项目数。
要创建新数组,根据某些条件更改项目数,请使用filter。
答案 4 :(得分:-1)
你可以做到
var arrayVal = [1, undefined, 2, 3, 4];
arrayVal = arrayVal.filter(function(n){ return n != undefined });
console.log(arrayVal);