对数组中的每个项目调用方法

时间:2014-01-22 16:05:41

标签: javascript arrays function foreach

想象一下我有这种类型:

function Greeter(greeting) {
     this.greeting = greeting;
}
Greeter.prototype.say = function(audience) { 
    audience = audience || "world";
    console.log(this.gretting, audience);
};

这样的数组:

var greeters = [new Greeter("hello"), new Greeter("bonjour")];

有没有办法做这样的事情:

greeters.onEach("say", "people");
// outputs:
// hello people
// bonjour people

当然这种方法是虚构的,但感觉应该有一些聪明的方法来做这件事而不在Array原型上定义一个新方法,也许是通过在forEach上使用call / apply / map /其他什么?

如果您有兴趣,请参阅以上onEach方法的简单实现:

Array.prototype.onEach= function(func) { 
    var args = Array.prototype.slice.call(arguments, 1); 
    this.forEach(function(item) { 
        item[func].apply(item, args); 
    });
};

2 个答案:

答案 0 :(得分:0)

你可以尝试这样的事情:

greeters.forEach(function(greeter){
   greeter.say('people');
});

答案 1 :(得分:0)

经过一番思考后,我认为实现这一目标的最佳方法是使用辅助函数。这样可以节省对Array原型的污染,并且仍然可以解决这个问题。它与我上面的onEach方法非常相似,但使用闭包来创建一个可以用作迭代器的函数。

function func(name) {
  var args = Array.prototype.slice.call(arguments, 1);
  return function(obj) {
    return obj[name] && obj[name].apply(obj, args);
  }
}

然后可以像上面这样使用我的数组:

greeters.forEach(func("say")); // call function "say" on each object
greeters.map(func("say", "people")); // ["hello people", "bonjour people"]

我怀疑这也将被视为解决问题的“更多功能”方法。在大型代码库中,这可能会节省大量的样板代码。