2013-10-04 62 views
4

例如,我有這樣的代碼在n次迭代地獄:如何避免-的if-else使用JavaScript

var Foo = [1,2,3,4]; 

function searchInFoo(n) { 
    for(var i = 0, arrayLength = Foo.length; i < arrayLength; i++) { 
     if(Foo[i] === n) { 
      console.log("N: " + n + " found!"); 
     } else { 
      console.log("N: " + n + " not found!"); 
     } 
    } 
} 


searchInFoo(4); 

好了,正如我預料我美孚陣列具有n個元素我也是n爲迭代循環。這很酷。所以,如果我用任何n參數調用searchInFoo函數,我的函數也會執行if if else語句中的所有塊n次。例如,在上面的例子中,我曾經記錄過「發現」,並且三次發現「N:n not found!」。

什麼是避免在其他塊的執行,而不失去一些基本的錯誤捕獲功能,最好的辦法,實際上發生了什麼,當我忽略整個else塊喜歡這裏:

var Foo = [1,2,3,4]; 

function searchInFoo(n) { 
    for(var i = 0, arrayLength = Foo.length; i < arrayLength; i++) { 
     if(Foo[i] === n) { 
      console.log("N: " + n + " found!"); 
     } 
    } 
} 


searchInFoo(1); 
+0

如果省略了'else'塊和測試爲假,則代碼if塊中被跳過,對環繼續。 –

回答

4

你不需要循環在這種情況下:

var foo = [1,2,3,4]; 

function searchInFoo(n) { 
    if(foo.indexOf(n) > -1) { 
     console.log("N: " + n + " found!"); 
    } 
} 
searchInFoo(1); 

注:不大寫的變量名,留到構造函數。

甚至更​​簡單:

function searchInFoo(n) { 
    return foo.indexOf(n) > -1; 
} 
console.log(searchInFoo(1) ? 'found' : 'not found'); 

在再次閱讀你的問題,我相信你正在尋找的東西更通用,像forEachmap(MDN上提供polyfills)。如何迭代通過給定數組的函數,並在每個項目上運行函數?

function myforeach(arr, fn) { 
    for(var i=0; i<arr.length; i++) { 
     fn(arr[i]); 
    } 
} 
myforeach([1,2,3], function(el) { 
    console.log(el === 1); 
}); // logs true, false, false 

自定義map功能將是非常相似:

function mymap(arr, fn) { 
    var retArray = []; 
    for(var i=0; i<arr.length; i++) { 
     retArr.push(fn(arr[i])); 
    } 
    return retArray; 
} 
var validated = myforeach([1,2,3], function(el) { 
    return el === 1; 
}); // returns [true, false, false] 
+1

請注意,Array.indexOf是ECMA5規範的一部分,因此不適用於舊版瀏覽器。如果需要,你可以使用[polyfill](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf) – LanguagesNamedAfterCofee

+0

是的,我總是忘記這一點。這種基本的方法......從一開始就可用於字符串。無論如何,現在你鏈接到polyfill,這個答案就完成了! :-) 謝謝。 – bfavaretto

+0

@bfavaretto 我忘了提及,我在對象上使用類似的表達式,迭代通過臨時數組中的所有對象,而不是記錄符合條件的對象的屬性,如下所示: 'code'if(n === Foo [i] .someProperty)'code' –