2015-05-06 88 views
3

試圖創建「一些」功能。即如果任何德數組中的元素滿足條件返回trueJavascript - 創建「一些」功能

function some(array, predicate) { 
    for (var i = 0; i < array.length; i++) { 
    if (predicate(array[i])) 
     return true; 
    } 
    return false; 
} 

console.log(some([NaN, 3, 4], isNaN)); 
// → true 
console.log(some([2, 3, 4], isNaN)); 
// → false 

問題1:以上就是書中的解決方案,我不知道爲什麼「返回false」將覆蓋「返回true」在每一個案例。上面的解決方案似乎表明,只有當「返回true」從未運行時,「return false」纔會運行 - 爲什麼?

我的解決方案看起來像這樣。

var some = function(array, condition) { 
    var answer = false; 
    for(var i=0; i<array.length; i++) { 
    if(condition(array[i])) {answer = true}; 
    } 
    return answer 
}; 

問題2:這本書更好的解決方案,因爲它需要較少的內存(即「答案」變量)?

謝謝!

+2

因爲如果你已經返回true,你離開函數並且'return false'從不執行。 –

+0

如果你不想重新發明輪子,那麼它是值得的:http://underscorejs.org/#some – asawyer

回答

2

return控制執行指針位於當前正在執行的腳本的位置。當遇到return時,它會將執行指針移出該函數,因此該函數將停止執行。這意味着如果return true被執行,return false將不會被執行。

1

當執行命中return語句時,它將離開當前函數,而不管它在該函數內的哪個塊。

只要數組元素對應於謂詞,它就會返回true。如果執行正常退出for循環,則表示沒有單個值是有效的,因此我們可以返回false。

本書的答案比較好,不是因爲它沒有創建額外的變量(沒關係),而是因爲它不會每次檢查所有變量。只要數組元素有效,它就退出該函數。

+0

我覺得我的英語在那個答案中很糟糕,建議我編輯一下,如果你知道如何「 「它更好。 –

2

本書中的解決方案基於for循環體內使用的return關鍵字將導致循環停止執行並返回的事實。

看看AT的中斷函數的return文件,其中規定部分:

return語句結束函數執行和指定的值 返回給函數調用。

在你的榜樣,只要condition匹配,這本書的解決方案將不再繼續通過數組進行迭代,並返回(因爲這是每個定義回做什麼上面)。

讓我們看一下你的解決方案:

var some = function(array, condition) { 
    var answer = false; 
    for(var i=0; i<array.length; i++) { 
    if(condition(array[i])) {answer = true}; 
    } 
    return answer 
}; 

發生什麼情況,如果條件得到滿足?您將answer設置爲true,但循環將繼續檢查數組中的後續元素。

考慮數組非常大並且您想要在數組內找到特定值的用例。

你認爲哪種效率更高:在找到匹配後停止或者只有在查看所有元素後才返回匹配的那個?

在這種情況下,答案是後者。如果你已經找到你需要的東西,不要循環遍歷所有元素。

1

您可以使用內置的Array方法,some()

var test = [NaN, 3, 4].some(isNaN); // true 
0

什麼該函數的作用是

function some(array, predicate) {   // return a boolean value (true, false) 
              // as soon an Array key matches `predicate` 

    for (var i = 0; i < array.length; i++) { 
    if (predicate(array[i])) return true; // if Array key isNaN exit function as `true` 
    } 
    // We're 1. already out of the function or 2. all keys are looped. 
    // This function needs to return a boolean so exit with `false` 
    // since all Array keys are Numbers 
    return false;        

} 

上述解釋這一切。請記住,說部分:
返回一個布爾值(真,假),一旦數組鍵匹配predicate
在你的榜樣,你不退出功能,所以如果你通過例如一個
陣列1000個的鍵,每一個鍵就可以循環,其功能並不意味着這樣做,因爲這是其目的是:

回報(出口)爲true如果至少一個密鑰相匹配的謂詞條件

由於我們已經發現一個密鑰匹配,所以其他所有密鑰都是無用的。

是的,var消耗解釋器內存(沒什麼可擔心的)。