我是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"?
答案 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;
};
但是这种方法有一个缺点:它需要遍历整个数组(你不能破坏)。
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)