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

Javascript 对列表/数组中的每个项运行相同的函数 目标,javascript,function,Javascript,Function,我有。在脚本中的许多情况下,函数按顺序运行。在这些情况下,有很多重复的代码需要整合 理想情况下,更改如下代码: functionName("First_item") + functionName("Second_item") + functionName("Third_item") + functionName("First_item", "Second_item", "Third_item"); 对这样的事情: functionName("First_item") + functi

我有。在脚本中的许多情况下,函数按顺序运行。在这些情况下,有很多重复的代码需要整合

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

functionName("First_item") + 
functionName("Second_item") + 
functionName("Third_item") + 
functionName("First_item", "Second_item", "Third_item");
对这样的事情:

functionName("First_item") + 
functionName("Second_item") + 
functionName("Third_item") + 
functionName("First_item", "Second_item", "Third_item");
该函数将为列表中的每个项目运行,因此结果相同,但代码更加优雅且易于维护

注:

  • 我不打算使用任何库(例如jQuery)来实现这一目标
解决方案
  • 请注意我可以使用。当我实现代码时,只返回第一个参数/项的
    输出
    字符串

  • 指出了最终的解决办法

    • 通过连接(连接)for循环中的
      输出
      字符串(使用
      +=
      ),从所有参数/项的输出中生成一个字符串
    • 通过将
      返回
      置于for循环的外部,返回连接的输出
  • 例子


    谢谢
    非常感谢大家在这方面花费的时间和帮助。我真的很感激

    您不需要数组。只用

    如果支持传统IE版本不是问题,p.S@codebox的解决方案就可以工作。不知道他为什么要删除它…所以把它放在这里,这样会有帮助。他的回答使用了


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

    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]);
    }
    

    我还没有测试过它,但它应该可以工作。

    利用Javascript的原型OOP:您可以向数组本身添加一个each函数,这样代码中的每个数组都会自动拥有一个固有的each函数

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

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

    Array.prototype.each = function(callback){
        for (var i =  0; i < this.length; i++){
            callback(this[i]);
        }
    }
    
    有关更多信息:

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

    洛达斯:

    下划线


    为了避免代码中的冗余,请使用一个包含值的数组,该值要通过函数并在循环中调用函数

    var vals=["shot_type","shot_height","shot_angle","framed","scene_depth"];
    for(var i=0; i<vals.length; i++)
    {
        FunctionName(vals[i]);
    }
    
    var vals=[“镜头类型”、“镜头高度”、“镜头角度”、“帧”、“场景深度”];
    
    for(var i=0;i的含义非常类似于
    Array.prototype.reduce
    ,或者
    Array.prototype.map
    后跟
    .join()
    。或者您只需使用数量可变的参数。“这很好,但效率很低”?低效?还是不优雅?@Zeta我想都是!当我说低效时,我并不是说代码运行缓慢。相反,同样的事情可以用更少的代码来“说”。因此,考虑到我在脚本中使用函数的总次数,以不同的方式编写会更有效率。也许冗余可能是更好的选择er表达式效率不高。谢谢你。你应该说的是,你希望你的代码更易于维护,因为可维护性使用的代码更少。我仍然强烈建议使用lodash或下划线。这是因为它们处理了很多你会遇到的警告(如果你愿意,请回答)-为什么要重新发明轮子。不客气,我个人认为Amit Joki的答案是我最喜欢的答案(仅仅因为使用参数非常棒)不客气,格雷格。如果有什么我可以做的来更好地解释我的答案,请让我知道。另外,请查看一个名为codeschool的网站,我在那里学到了很多东西,我认为这真的会很有帮助。嗨,docodemore。我已经整理了一个简化的,它可能更有助于展示我所拥有的以及我希望通过代码实现的目标。如果不要太麻烦了,请你看一下,看看你对我如何能得到类似的工作有什么想法。谢谢你推荐我到codeschool。我期待着参观它。让我们。@Amit谢谢。不幸的是结果是一样的。你如何调用函数?@Amit,如果你调用函数的话在对象上使用代码将改变对象本身,而不是返回新的对象。只有在原语中,代码才能工作。这是因为对象是通过引用传递的,而原语是通过值传递的。(搜索javascript通过引用传递vs通过值传递)您的代码无法处理所有类型的函数或传递的对象:请看这个Hi-Timmy。非常感谢您的回复。我已尝试实现您的代码,但无法使其正常工作。它不是对数组中的每个项运行函数的for循环,而是返回数组内容,而不对其执行任何操作。请稍后重试请看一下这篇文章,看看你是否能看出我实现你的建议的方式有什么问题。下面是一段工作但冗余的代码,以显示我试图使用数组实现的输出。非常感谢!如果你想一想的话,我更喜欢它。编程意味着总是要搜索错误。。。在工作的JSFIDLE中,您将函数调用的每个返回值都包含在一个字符串变量中。因此,请尝试在
    brief
    变量中保存完整的字符串,说明您在第一个JSFIDLE中是如何完成的,并通过元素值传递它。希望我能提供帮助;)非常感谢您的帮助Timmy!非常感谢,非常有帮助。如果我的评论对您有帮助,我希望您能给我+1;)
    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);
    });
    
    _([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)
    
    _.each([1, 2, 3], alert);
    => alerts each number in turn...
    
    var vals=["shot_type","shot_height","shot_angle","framed","scene_depth"];
    for(var i=0; i<vals.length; i++)
    {
        FunctionName(vals[i]);
    }