2

我有一些for {}在整个项目中反复使用的 javascript 循环,它们都类似于:

for (var i = 0; i < things.length; i++) {
    console.log(things[i]);
    // This may be different in different areas of the project
}

我缩小了代码,但循环占用了很多缩小的代码。有没有办法把上面的代码缩短成这样:

loop {
    console.log(things[i]);
    // This may be different in different areas of the project
}

可能不是上面的,但你明白了。任何帮助将非常感激 :)

4

5 回答 5

4

如果你重复打印不同的数组,你可以为它创建一个函数来减少你的重复:

function printArray(arr) {
    for (var i = 0; i < arr.length; i++) {
        console.log(arr[i]);
    }
}

然后像这样调用:

printArray(things);

如果您所做的不仅仅是打印,并且希望它更通用,您应该使用回调,如下所示:

function loopArr(arr, cb) {
    for (var i = 0; i < arr.length; i++) {
        cb(arr[i]);
    }
}

这可以称为:

loopArr(thing, function (i) {
    console.log(i);
});

小提琴


还有一些工具已经可以为您执行此操作,例如,如果您正在使用(或想要使用)jQuery,您可以使用jQuery.each()

于 2013-08-19T21:18:06.363 回答
3

一种 jQuery 风格的方法:

function each(arr, func) {
  for ( var i = 0; i < arr.length; ++i ) {
    func(arr[i]);
  }
}

可以这样称呼:

each( things, function(thing) { console.log(thing); } );

或者

each( things, function(thing) { console.log(thing); alert(thing); } );

等等

于 2013-08-19T21:19:10.507 回答
1
function forEach(array, func) {
    var i = array.length;
    while(i--) {
        func(array[i]);
    }
}
于 2013-08-19T22:31:51.380 回答
1

您必须传入项目和回调,但当然这是可能的。

function loop (item, callback) {
    for (var i = 0; i < item.length; i++) {
        callback(item[i]);
    }
}

用途:

loop(things, function (item) {
    console.log('do things here with each ' + item);
});

另请注意,在更现代的浏览器中,您可以简单地执行以下操作:

things.forEach(function (item) { 
    /* do whatever */
});
于 2013-08-19T21:20:01.867 回答
0

Everyone beat my to it, but here is another way to write it

function forEach(collection, callback){
    var e;

    for (var i = 0; e = collection[i++];) {
        callback(e);
    }
}

And its' usage:

var a = ["The", "Brown", "Cow"];

forEach(a, function(e) { console.log(e); });

Should be mentioned that there are tons of implementations of iterator functions. Your exact case my need to improve upon these.

于 2013-08-19T21:25:22.850 回答