对列表/数组中的每个项运行相同的函数

时间:2014-11-24 14:50:56

标签: javascript function

目标

我有a working function (JSFiddle)。在整个脚本中的许多场合,该函数按顺序运行。在这些情况下,我想要整合很多重复的代码。

理想情况下更改代码如下:

functionName("First_item") + 
functionName("Second_item") + 
functionName("Third_item") + 

对于这样的事情:

functionName("First_item", "Second_item", "Third_item");

该函数将针对列表中的每个项目运行,因此结果相同但代码更加优雅和可维护。

注意:

  • 我不打算使用任何库(例如jQuery)来实现目标。

解决方案

  1. Amit Joki’s answer请注意我可以使用arguments。当我实现代码时,the modified function (JSFiddle)仅返回第一个参数/ item的output字符串。

  2. Vanice’s answer指出了最终的解决方案。

    • 通过连接(加入)for循环中的output字符串(使用+=),从所有参数/项的输出中创建一个字符串。
    • 通过将return置于for循环之外来返回连接的输出。
  3. 实施例

    Working solution (JSFiddle)


    感谢

    非常感谢大家的时间和帮助。我真的很感激!

4 个答案:

答案 0 :(得分:5)

利用Javascript的Prototype OOP:您可以将每个函数添加到Array本身,因此代码中的每个数组都会自动拥有每个函数。

Array.prototype.each = function(callback){
    for (var i =  0; i < this.length; i++){
        callback(this[i]);
    }
}

<强>用法:

myArray.each(myCoolFunction) ['something','somethingelse',somethingother'].each(myCoolFunction)

myArray.each( function (item) {
 // if your item has a method
 item.Something();
 // if you'd like to call a function on the item:
 doSomething(item);
});

<强>注意事项:

因为javascript是一种异步语言,在各种浏览器中的解释方式不同,并且固有地处理原始对象和复杂对象的方式不同,所以强烈建议使用下划线或lodash。您也可以自己创建,但是您需要确保正确处理通过的对象。这可能包括变通办法或为通过each函数传递的不同对象类型创建特殊回调函数。

有关详细信息:Is JavaScript a pass-by-reference or pass-by-value language?

您应该认真考虑的图书馆:

<强> lodash https://lodash.com/docs#forEach

_([1, 2, 3]).forEach(function(num) { console.log(num); }).join(',');
// → logs each number and returns '1,2,3'

_.forEach({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { console.log(num); });
// → logs each number and returns the object (property order is not guaranteed across environments)

<强>下划线http://underscorejs.org/#each

_.each([1, 2, 3], alert);
=> alerts each number in turn...

答案 1 :(得分:3)

你不需要阵列。只需使用arguments

即可
function functionName(){
   for(var i = 0; i < arguments.length; i++){
      // do something with arguments[i];
   }
}

然后你可以做

functionName("shot_type","shot_height","shot_angle","framed","scene_depth");
如果支持旧版IE版本不是问题,那么P.S @ codebox的解决方案是有效的。不知道为什么他删除了它...所以把它放在这里这样有帮助。使用forEach

他的答案
["shot_type","shot_height","shot_angle","framed","scene_depth"].forEach(FunctionName);

答案 2 :(得分:2)

编辑:看看你的小提琴,你在for循环中有一个返回 - 因此该函数将在第一次迭代后返回。在for之后放置return并将输出连接到一个字符串。

var output = "";
for(...){
    output += description_of_object + ": " + randomly_selected_item_from_object + ".\n";
}   
// return it
return output;

仅限Javascript:

var actions = ["shot_type","shot_height","shot_angle","framed","scene_depth"];
for (var i = 0; i < actions.length; i++){
  FunctionName(actions[i]);
}

使用JQuery:

$.each(["shot_type","shot_height","shot_angle","framed","scene_depth"], function(index,value){
  FunctionName(value);
});

我还没有对它进行过测试,但它应该可行。

答案 3 :(得分:2)

为了避免代码中的冗余,请使用带有值的数组,您希望通过该函数并在循环中调用该函数。

var vals=["shot_type","shot_height","shot_angle","framed","scene_depth"];
for(var i=0; i<vals.length; i++)
{
    FunctionName(vals[i]);
}

如果要扩展函数(添加另一个参数),可以只展开for循环和数组结构。

或者,您可以使用值填充对象并在对象中处理此逻辑。但这只会对调用函数产生影响。