如何在使用JavaScript的n次迭代中避免for-if-else地狱

时间:2013-10-04 23:12:42

标签: javascript if-statement

例如我有这段代码:

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个元素的Foo数组,我也有n次迭代的for循环。这很酷。所以,如果我用任何n参数调用searchInFoo函数,我的函数也将执行if else语句中的所有块n次。例如,在上面的例子中,我曾经记录过“n found”,并且三次“N:n not found!”。

避免在else块中执行的最佳方法是什么,不丢失一些基本的错误捕获功能,当我省略整个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);

1 个答案:

答案 0 :(得分: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上提供的polyfill)。如何迭代一个给定的数组,并在每个项目上运行一个函数?

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]