4

例如我有这个代码:

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);
4

1 回答 1

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]
于 2013-10-04T23:13:54.247 回答