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

时间:2016-06-24 23:39:47

标签: javascript arrays

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

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]

4 个答案:

答案 0 :(得分:1)

设计过滤器的方式,当数字不均匀时,函数isEven()会将undefined推送到数组中,因为undefined是JavaScript中函数的默认返回值

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

JavaScript中有本机函数(请参阅主要帖子评论/其他答案)以帮助您获得相同的结果;但是,如果您想要使用此路由,建议您在将回调结果推入阵列之前检查回调结果。

答案 1 :(得分:0)

Account ac = new Account(Parameters);

如果返回true,则

Array的过滤函数会向新数组添加元素。所以我写了条件[0,1,2,3,4,5,6,7].filter(function(digit){return digit%2===0}) digit%2 === 0true个数字

答案 2 :(得分:0)

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

&#13;
&#13;
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));
&#13;
&#13;
&#13;

但是如果你想要一些map和filter的混合,只需在将它推送到数组之前检查映射值是否与undefined不同。

&#13;
&#13;
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));
&#13;
&#13;
&#13;

答案 3 :(得分:0)

问题是你的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。