[英]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");
如果您要按照自己的方式推送每個函數及其參數,則必須像下面這樣包裝函數:
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.