Javascript .map()正在将不需要的未定义值存储到新数组中

Javascript .map()正在将不需要的未定义值存储到新数组中,javascript,arrays,function,return,Javascript,Arrays,Function,Return,简单数组声明: let sodas = ["Sprite", "Coke", "Mountain Dew", "Dr. Pepper", "Sunkist"]; 我想使用.map函数创建一个新数组,其中包含仅由CocaCola公司拥有的苏打水,然后在控制台中显示此新数组- let cocacola_sodas = sodas.map(soda => { if ((soda == "Coke") || (soda == "Sprite")) { return soda; }

简单数组声明:

let sodas = ["Sprite", "Coke", "Mountain Dew", "Dr. Pepper", "Sunkist"];
我想使用.map函数创建一个新数组,其中包含仅由CocaCola公司拥有的苏打水,然后在控制台中显示此新数组-

let cocacola_sodas = sodas.map(soda => {
  if ((soda == "Coke") || (soda == "Sprite")) {
    return soda;
  }
})

console.log(cocacola_sodas);

这段代码似乎有效,但我不确定为什么它会将5个新元素返回到cocacola_sodas数组中,而其中只有2个应该返回coke和sprite。数组将显示[Sprite,Coke,undefined,undefined,undefined]。为什么它返回未定义的值

使用过滤器而不是贴图。它是在这种情况下制造或使用的。正如其他答案所指出的,映射将始终返回与输入数组中存在的元素数相同的元素数

让苏打水=[雪碧,可乐,山露,胡椒博士,桑基斯特]; 让cocacola_苏打水=苏打水{ 如果苏打水==可乐| |苏打水==雪碧{ 返碱; } }
console.logcocacola_苏打水 要详细说明@省略号答案: 这里过滤器更好的原因是,它正在生成一个新的项目数组,而不是从原始数组中过滤出来

映射之所以给您显示结果,是因为它不是过滤,而是更改每个元素并将其提供给结果数组。我认为一个代码示例将有助于澄清

地图在引擎盖下可能看起来像这样:

var array = ['one', 'two', three];
var mapFunc = function(item) {
    if(item == 'two')
        return item;
};
var mappedArray = [];
for(var i = 0; i < array.length; i++)
    mappedArray.push(mapFunc(array[i]));

显然,上面的内容已简化为清晰的内容,但正如您所看到的,映射数组中的项与原始数组中的项一样多。由于在item不等于2的情况下不返回任何内容,因此返回undefined,这就是为什么在示例中有额外的项。

@awoldt,为了帮助您了解实际发生的情况,Array.prototype.map将始终将相同数量的元素从输入数组返回到新数组

所以最好的方法是给map一个包含x个元素的数组,不管你对传递给map的块中的元素做了什么,它都会在新数组中返回x个元素

正如所建议的,类似于filter/reduce的东西将返回一个新数组,其中只包含满足您在传递给这些助手的块中设置的条件的元素

您可以在MDN上阅读有关map和所有Array.prototype.methods的更多信息。includes方法确定数组的条目中是否包含某个值,并根据需要返回true或false

让苏打水=[雪碧,可乐,山露,胡椒博士,桑基斯特]; 让可口可乐=[可乐,雪碧]; 让cocacola_sodas=sodas.filtersoda=>cocacola.IncludeSoda
console.logcocacola_苏打水;因为这就是映射函数为这些元素返回的结果。