2015-03-19 103 views
0

我是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和回調函數,但由於我是新來的語言,你能解釋一下到底爲什麼我的代碼將返回「未定義」?

回答

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

爲什麼你必須返回numArray.some()?爲什麼回調函數中的return語句不夠? – Haque1 2015-03-19 11:31:10

+1

因爲除此之外,當你調用'containsEvenNum()'時,你會得到'undefined',它需要被中繼。就像你會做的一樣,假設你需要從點a到點c得到一些數據,並通過點b。 b點也需要將數據傳送到c點,否則c就不會有數據,這意味着數據在傳送過程中會丟失。 – axelduch 2015-03-19 11:32:09

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

我知道,這事做與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)) { ... } 

或者其他陣列的方法:

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

或者爲composition

相關問題