确定数组是否包含偶数

Determining if an array contains an even number

本文关键字:包含偶 是否 数组      更新时间:2023-09-26

我是javascript的新手,正在尝试了解这种语言。这是我写的一个函数,如果数组包含偶数,它应该返回true,如果不包含偶数,则返回false。

var containsEvenNums = function(numArray) {
    numArray.forEach(function(element) {
        if(element % 2 == 0) {
            return true;
        }
    });
    return false;
};
var main = function() {
    var nums = [1,2,3,4];
    console.log("This array contains even number(s): " + containsEvenNums(nums));
};

我知道这与AJAX和回调函数有关,但由于我是该语言的新手,你能解释一下为什么我的代码返回"未定义"吗?

您不会在任何地方保存数组中存在偶数的事实。

你可以这样做

var containsEvenNums = function(numArray) {
    var containsEvenNum = false;
    numArray.forEach(function(element) {
        if(element % 2 == 0) {
            containsEvenNum = true;
        }
    });
    return containsEvenNum;
};

但这种方法有一个缺点:它需要遍历整个数组(不能破坏)。

我建议使用Array.prototype.some

var containsEvenNums = function(numArray) {
    return numArray.some(function(element) {
        return element % 2 === 0;
    });
};

main()方法返回错误值,因为在forEach内部,它检查数组的每个值,然后运行最终语句return false。循环在第一次匹配时没有停止。

如果您使用了普通的for循环,它会很好地工作。

您可以在函数中使用var flag = false;。在forEach循环中,如果存在偶数,则设置标志。返回该标志。

否则我更喜欢:

var containsEvenNums = function(numArray) {
    return numArray.some(function(value) {
       return value % 2 ==0;
   });
}

我知道这与AJAX和回调函数有关

不,没有;AJAX通常是描述使用XMLHttpRequest进行异步调用的模式。

你的问题可能更多地与函数编程有关,在函数编程中你有一类函数。

在您的特定情况下,您有两个匿名函数:第一个分配给containsEvenNums,第二个作为forEach的参数。您的return语句在其中,因此containsEvenNums没有return语句,因此它总是返回undefined。此外,这里不建议使用forEach,因为无论如何都要迭代数组的所有项,所以如果您的场景知道数组是否至少包含一个偶数,则是次优的。

如果你找到一个偶数,你肯定可以设置一个变量:

var containsEvenNums = function(numArray) {
  var containsEven = false;  
  numArray.forEach(function(element) {
    if(element % 2 == 0) {
      containsEven = true;
    }
  });
  return containsEven;
};

但正如所说,这是次优的。你可能一找到偶数就想停下来,所以可能有些就是你想要的:

function isEven(number) {
  return number % 2 === 0;
}
function containsEvenNums(numArray) {
  return numArray.some(isEven);
}

正如你所看到的,功能性更强的方法的优点是你有更多的泛型谓词函数。在这种情况下,isEven可以用作独立函数,用于单个值:

if (isEven(userInput)) { ... }

或者对于其他Array的方法:

// every item of the array has to be even
var result = numArray.every(isEven)

或者用于构图。