2013-10-04 64 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' –