例如我有这段代码:
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);
答案 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');
再次阅读您的问题后,我相信您正在寻找更通用的内容,例如forEach
和map
(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]