【问题标题】:Push Functions into an Array - Loop through and Splice?将函数推入数组 - 循环和拼接?
【发布时间】:2012-09-16 07:25:02
【问题描述】:

使用 Javascript 我需要能够:

1:将一定数量的相同函数(每个函数的参数不同)压入一个数组中。

2:然后一个一个地运行每个函数(在这个例子中只是一个参数/数字的警报)

3:在每个函数之后,我需要能够从数组中拼接出该函数

4:每次后检查数组长度 - 一旦数组再次为空 - 提醒用户它已完成

现在我似乎能够完成任务 1,2 和 4,但我正在为如何在运行后从数组中拼接出函数而苦恼 - 有人可以帮忙吗?由于我无法删除该功能,因此一旦调用了所有功能,我就永远不会收到“完成”警报

到目前为止,我的 javascript 代码是:

// Create empty array
var array = [];

// Push functions into array - dynamic amount and could be any amount of functions
array.push(func(1));
array.push(func(2));
array.push(func(3));

// Call array manager function after pushing array
arrayManager();

// Array manager function to splice and detect when finished
function arrayManager() {
    if (array.length < 1) {
        alert("done");
    }
    else {
    //////////////////////////////////
    // << THIS IS WHERE I DON'T KNOW HOW TO SPLICE THE ITEM FROM THE ARRAY
    //////////////////////////////////
    }
}

// Function for array objects - alert passed parameter
function func(num){
    alert(num);
}

【问题讨论】:

  • 您到底想完成什么?可能有更直接的方法来做到这一点。
  • 你读过the splice documentation吗?
  • “length”属性也是从 1 开始,而不是 0
  • @zero 一个没有元素的数组呢?
  • 现在,您没有将任何函数推送到数组中。

标签: javascript arrays push


【解决方案1】:

首先,您现在没有将函数推送到数组中,而是执行 func。要实现推送,您的 func 应如下所示:

// Function for array objects - alert passed parameter
function func(num){
  return function(){
    alert(num);
  }
}

现在,如果您的函数是同步的,您可以简单地遍历数组

for(var i in arr){
  arr[i]();
}
console.log('done');

如果我们正在处理异步函数,那么它们需要有一个回调:

// Function for array objects - alert passed parameter
function func(num){
  return function(callback){
    alert(num);
    callback();
  }
}

然后您可以使用计数器并行运行。

var count = arr.length;
for(var i in arr){
  arr[i](function(){
    if(--count === 0){
      console.log('Done');
    }
  });
}

或按顺序:

function run(){
  var fn = arr.shift();
  if(!fn){
    console.log('Done');
  } else {
    fn(run);
  }
}
run();

【讨论】:

  • 感谢您的回答!当然,异步迭代需要调用 fn(run()) 否则它将在第一次“运行”(双关语)后停止。如果我遗漏了什么,一定要让我知道为什么我错了。 :D
【解决方案2】:

这应该可以满足您的需求:

var next_func = array.splice(0, 1)[0]

“splice”至少有两个参数:第一个是开始删除的索引,第二个是要删除的项目数。当它返回一个新数组时,只需获取从拼接中获取第一个值的函数。您还可以在前两个参数之后添加任意数量的值;这些将被添加到数组中以代替您删除的内容。

但是,我很好奇您为什么要这样做 - 虽然我可以理解以非传统方式做某事是一种智力练习,但如果您是编程新手,我会说有更好的方法这。当您使用其中的函数时,没有特别需要从数组中删除项目。对我来说,从数组中执行每个函数,然后在完成循环后设置“array = []”会更有意义。但是,根据情况,这可能仍然是做你正在做的事情的最佳方式,我只是想我会给一些思考。

【讨论】:

  • 我对 javascript 非常陌生(而且通常是真正的编码),所以如果我的一些方法看起来很奇怪或者有更简单的方法可以做到这一点,我深表歉意。基本上,我在 Titanium Appcelerator 中为移动应用程序使用纯 javascript - 在整个应用程序中,用户将绘制和绘制涂鸦或草图,在应用程序结束时,我需要能够将所有创建的涂鸦上传到服务器上。我关于如何做到这一点的想法是将每个涂鸦作为一个函数添加到一个数组中,循环上传数组直到它为空,当它为空时允许它们继续 - 如果这有意义吗?
  • 表面上听起来相当合理。但是,如果您一次卸载所有功能,则确实无需为拼接而烦恼。在这种情况下,诸如拼接之类的主要优点是,如果您以某种随机的方式执行功能。如果您打算一次执行它们,我会使用 for 循环遍历并执行它们中的每一个,然后在完成后将数组设置为空。此外,如果您是 javascript 新手,请务必查看链接的 MDN 资源 Chris Francis - 这是了解 javascript 的好方法。
【解决方案3】:
// Create empty array
var array = [];

// Push functions into array - dynamic amount and could be any amount of functions
array.push(function() { func(1); });
//if you call array.push(func(1)) the function is executed immediatly
//then null is stored in the array
array.push(function() { func(2); });
array.push(function() { func(3); });

// Call array manager function after pushing array
arrayManager();

// Array manager function to splice and detect when finished
function arrayManager() {
    while (array.length){
        var fnc=array.splice(0,1)[0]
        fnc();
    }
    alert ("done");            
}

// Function for array objects - alert passed parameter
function func(num){
    alert(num);
}​

【讨论】:

    【解决方案4】:

    这是你需要的吗?

    1:将一定数量的相同函数(每个函数的参数不同)压入数组中。

    function func(num){
        alert(num);
    }
    
    var k = [];
    k.push({f:func, params:[1]});
    k.push({f:func, params:[2]});
    k.push({f:func, params:[3]});
    

    2:然后一个一个地运行每个函数(在这个例子中只是一个参数/数字的警报)

    3:在每个函数之后,我需要能够从数组中拼接出该函数

    4:每次后检查数组长度 - 一旦数组再次为空 - 提醒用户它已完成

    while (k.length > 0) {
     k[0].f(k[0].params);
     k.shift();
    }
    alert("done");
    

    【讨论】:

      【解决方案5】:

      http://jsfiddle.net/nZ459/1/

      如果你想以你正在做的方式推送每个函数及其参数,你必须像这样包装函数:

      function wrapper(arg){
          return function(){
              console.log(arg);
          };
      }
      
      
      var ar = [];
      
      console.log("pushing functions");
      
      ar.push(wrapper(1));
      ar.push(wrapper(2));
      ar.push(wrapper('three'));
      
      console.log("done pushing functions");
      
      while (ar.length){
          var fn = ar.shift();
          console.log("calling ", fn);
          fn();
      }
      

      或者,您可以创建一个通用包装器,该包装器接受一个函数,并将参数作为参数,并返回一个匿名函数。

      为了更直接地回答您的问题,以您想要的方式遍历数组的最简单方法是这样的:

      while (array.length){
          var item = array.shift();
          ...
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-25
        • 2018-09-09
        • 2012-02-18
        • 1970-01-01
        • 2017-12-23
        • 2012-07-11
        • 2014-11-12
        • 1970-01-01
        相关资源
        最近更新 更多