簡體   English   中英

將函數推入數組-循環和拼接?

[英]Push Functions into an Array - Loop through and Splice?

使用Java語言,我需要能夠:

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

首先,您現在不將函數推入數組,而是執行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();
// 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);
}​

這應該可以滿足您的需求:

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

“拼接”至少需要兩個參數:第一個是要從中刪除的索引,第二個是要刪除的項目數。 當它返回一個新數組時,要獲得該函數,您需要從接合處獲得第一個值。 您還可以在前兩個參數之后添加任意數量的值。 這些將代替您已刪除的內容添加到數組中。

但是,我很好奇您為什么要這樣做-雖然我可以理解以一種非常規的方式做某件事,這是一種智力練習,但如果您是編程新手,我會說有更好的方法來做。 使用數組中的函數時,無需特別刪除數組中的項目。 對我來說,從數組中執行每個函數,然后在完成循環后設置“ array = []”會更有意義。 但是,視情況而定,這仍然可能是做您正在做的事情的最佳方法,我只是想我應該考慮一下。

這是您所需要的嗎?

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");

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();
    ...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM