正确地传递新值,但也将undefined传递给new数组

passing new values correctly but also passing undefined into new array

本文关键字:undefined 数组 new 新值 正确地      更新时间:2023-09-26

我声明了一个名为filter的函数,将数组和回调作为参数,并只将偶数传递给新数组。代码可以工作,但它也将非偶数传递为"未定义"(我引用它,不是字符串)。我做错了什么?

function filter(array, callback) {
  var output = [];
  for(var i = 0; i < array.length; i++) {
    output.push(callback(array[i]));
  }
  return output;
}
function isEven(elem) {
  if (elem % 2 === 0)
    return elem;
}
filter([0,1,2,3,4,5,6,7],isEven); -> [ 0,undefined,2,undefined,4,undefined, 6,undefined]

过滤器的设计方式是,当一个数字不是偶数时,函数isEven()将把undefined推入数组,因为undefined是JavaScript函数的默认返回值。

基本上,您要求isEven()获得结果并将其存储在数组中,无论它是否实际上给了您所需的结果。

JavaScript中有原生函数(参见您的主要帖子评论/其他答案)来帮助您实现相同的结果;然而,如果你想走这条路,建议你在把回调的结果推入数组之前检查一下。

如果你只想要一个过滤器,回调应该只返回一个布尔值:

function filter(array, callback) {
  var output = [];
  for(var i = 0; i < array.length; i++)
    if(callback(array[i]))
      output.push(array[i]);
  return output;
}
function isEven(elem) {
  return elem % 2 === 0;
}
console.log(filter([0,1,2,3,4,5,6,7],isEven));

但是如果你想混合使用map和filter,只需要在将映射的值压入数组之前检查它是否与undefined不同。

function mapFilter(array, callback) {
  var output = [];
  for(var i = 0; i < array.length; i++) {
    var value = callback(array[i]);
    if(value !== undefined)
      output.push(value);
  }
  return output;
}
function isEven(elem) {
  if (elem % 2 === 0)
    return elem;
}
console.log(mapFilter([0,1,2,3,4,5,6,7],isEven));

[0,1,2,3,4,5,6,7].filter(function(digit){return digit%2===0})

Array的

filter函数如果返回true,则向新数组添加元素。所以我写了条件digit%2 === 0也就是true对于even的数字

问题是您的isEven函数仍然为每个输入元素返回一个数组元素。如果输入值为偶数,则返回输入值,否则返回undefined(这是默认返回值)。

也许你的印象是,如果函数没有return一个值,什么也不会被添加到数组?不是这样的!

你需要这样做:

function filter(array, callback) {
  var r = [];
  for (var i = 0; i < array.length; i++) {
    if (callback(array[i])) {
      r.push(array[i]);
    }
  }
  return r;
}
function isEven(elem) {
  if (elem % 2 === 0)
    return elem;
}
filter([0,1,2,3,4,5,6,7],isEven);

但它会变得更好。JavaScript Array对象有一个内置的filter方法,它做的正是这个filter方法做的。你只需把你的回调传递给它。

[ 0, 1, 2, 3, 4, 5, 6, 7 ].filter(function (n) {
  return n % 2 === 0;
});

这个版本将只输出偶数…0、2、4、6