确定数组是否包含偶数

时间:2015-03-19 11:12:25

标签: javascript

我是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和回调函数有关,但由于我是该语言的新手,你能解释为什么我的代码正在返回" undefined"?

3 个答案:

答案 0 :(得分:1)

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

如果你使用了普通的for循环,它就可以正常工作。

您可以在函数中使用var flag = false;。在forEach循环内部,如果存在偶数,则设置标志。归还那面旗帜。

另外我更喜欢:

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

答案 1 :(得分:1)

您不会在阵列中保存偶数的事实。

你可以这样做

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

答案 2 :(得分:1)

  

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

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

您的问题可能与Functional Programming更具相关性,因为您拥有一流的功能。

在您的特定情况下,您有两个匿名函数:第一个,分配给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;
};

但如上所述,并不是最理想的。您希望在找到偶数后立即停止,因此some可能就是您正在寻找的内容:

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)

composition