【问题标题】:passing new values correctly but also passing undefined into new array正确传递新值,但也将未定义传递到新数组中
【发布时间】:2016-06-24 23:39:47
【问题描述】:

我已经声明了一个名为 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]

【问题讨论】:

  • 我很确定你已经知道了,只是留给其他人的便条 - Array 有一个过滤方法:[0, 1, 2, 3, 4].filter(element =&gt; element % 2 == 0)

标签: javascript arrays


【解决方案1】:

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

基本上,您是在向isEven() 询问结果并将其存储在数组中,无论它是否确实为您提供了您想要的结果。

JavaScript 中有本机函数(请参阅您的主要帖子 cmets/其他答案)来帮助您实现相同的结果;但是,如果您想走这条路线,建议您在将回调结果推送到数组之前检查它的结果。

【讨论】:

  • 也许你会提到undefined 是 JavaScript 中函数的默认返回值。函数不能没有有返回值。
【解决方案2】:

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

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));

【讨论】:

    【解决方案3】:

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

    Array 的filter 函数如果返回true,则将元素添加到新数组中。所以我写了条件digit%2 === 0,这将是true for even 数字

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-15
        • 1970-01-01
        • 2018-05-20
        • 1970-01-01
        相关资源
        最近更新 更多