在Javascript中,如何同时对两个seq的元素执行函数?

时间:2012-02-03 07:00:40

标签: javascript jquery iteration loops underscore.js

在Javascript中,在两个数组上并发迭代并在两个运行元素上调用函数的最佳方法是什么?例如:

var a = [1, 2, 3];
var b = [11, 12, 13];
function my_func() { /* some custom function */}

代码应执行my_func 3次,如下所示:

my_func(1,11);
my_func(2,12);
my_func(3,13);

如何在不定义新函数的情况下实现这一目标,但使用jQuery / underscore api?

3 个答案:

答案 0 :(得分:3)

例如,这种方式(使用underscore.js)?

_.each( _.zip(a,b), my_func );

function my_func( pair ){
  alert( pair[0] + pair[1] );
}

或者:

_.each( _.zip(a,b), function( pair ){
  my_func( pair[0], pair[1] );
  // or: my_func.apply( null, pair );
});

function my_func( a, b ){
  alert( a + b );
}

-

function wrapply( func, thisObj ){
  return function( args ){
    return func.apply( thisObj, args );
  }
}

var add = wrapply( function(a,b){ return a+b; });
alert( add([1,2]) );

答案 1 :(得分:3)

嗯,直接的JavaScript非常擅长这样做。假设您的for数组和a数组具有相同的长度,请使用标准b循环。

for (var i = 0; i < a.length; i++) {
    my_func(a[i], b[i]);
}

jQuery还提供了一种.each()方法,可以非常轻松地对一个序列进行操作。在 two 上操作只需要更多代码。

$.each(a, function(i, aItem) { my_func(aItem, b[i]); });

如果您想使用zip操作,可以使用jQueryArrayUtils plugin

$.zip(a, b).each(function() {
    var aItem = this[0];
    var bItem = this[1];
    my_func(aItem, bItem);
});

作为Python的粉丝,这最后一种方法对我来说特别好看。但老实说,如果你不打算做比调用my_func更复杂的事情,那么你也可以使用正常的for循环。

答案 2 :(得分:0)

[1,2,3].forEach(function(e, i, arr){my_func(e, arr[i]);}, [11,12,13]);

jQuery版本:

$.each(a, function(index, value) { 
    my_func(value, b[index]);
});