Javascript Array of Functions


129
var array_of_functions = [
    first_function('a string'),
    second_function('a string'),
    third_function('a string'),
    forth_function('a string')
]

array_of_functions[0];

Bu, istendiği gibi çalışmaz çünkü dizideki her işlev, dizi oluşturulduğunda yürütülür.

Aşağıdakileri yaparak dizideki herhangi bir işlevi yürütmenin doğru yolu nedir:

array_of_functions[0];  // or, array_of_functions[1] etc.

Teşekkürler!


1
'a string'Dizinin doldurulduğu anda bilinmesi gerekir mi , yoksa işlevi arayan kişi onu iletebilir mi?
Crescent taze

Neyi başarmaya çalıştığınıza dair daha fazla ayrıntı almak isterim, çünkü bunu halletmenin daha iyi bir yolu olabilir.
Jeff

2
"Fonksiyonlar Dizisi" - ya da ona yöntemlerle bir nesne demeyi sevdiğimiz gibi
symcbean

Daha fazla ayrıntı vermen gerektiğini düşünmüyor musun? Bunu halletmenin daha iyi bir yolu olabilir ..
IcyFlame

Yanıtlar:


234
var array_of_functions = [
    first_function,
    second_function,
    third_function,
    forth_function
]

ve sonra dizide belirli bir işlevi yürütmek istediğinizde:

array_of_functions[0]('a string');

16
İpucu: Boş olsa bile ()sonrasına koymayı unutmayın array_of_functions[0]. Sadece 'neden işe yaramadığını' bulmak için 20 dakika harcıyorum.
Horacio

Cazibe gibi çalıştı!
Moses Ndeda

Dinamik olabilmesi için 'firstFunction' gibi bir dize değeri ileterek bir işlevin dizinini nasıl elde edersiniz?
O'Dane Brissett

107

Bence orijinal afişin başarmayı amaçladığı şey bu:

var array_of_functions = [
    function() { first_function('a string') },
    function() { second_function('a string') },
    function() { third_function('a string') },
    function() { fourth_function('a string') }
]

for (i = 0; i < array_of_functions.length; i++) {
    array_of_functions[i]();
}

Umarım bu başkalarına yardımcı olur (20 dakika önce benim gibi :-) bir dizide JS işlevlerinin nasıl çağrılacağına dair herhangi bir ipucu arıyorum.


3
Fonksiyonlarımın aynı parametreleri almadığını varsayarak parametre çağrılarını değiştirmeme izin verdiği için tam da ihtiyacım olan şey bu: P
Jem

25

Neyi başarmaya çalıştığınıza dair daha fazla ayrıntı olmadan, biz biraz tahmin ediyoruz. Ancak bunun gibi bir şey yapmak için nesne gösterimini kullanmaktan kurtulabilirsiniz ...

var myFuncs = {
  firstFunc: function(string) {
    // do something
  },

  secondFunc: function(string) {
    // do something
  },

  thirdFunc: function(string) {
    // do something
  }
}

ve onlardan birini aramak için ...

myFuncs.firstFunc('a string')

1
Fonksiyon indeksini hatırlamamız gerekmediğinden bunun daha geliştirici dostu olduğunu düşünüyorum. Ve ayrıca, herhangi bir işlevi belirli dizinde itmek istersek, yanındaki tüm işlevlerin dizininde değişikliğe neden olur. Bunu kullansanız iyi olur
dd619

16

Ya da sadece:

var myFuncs = {
  firstFun: function(string) {
    // do something
  },

  secondFunc: function(string) {
    // do something
  },

  thirdFunc: function(string) {
    // do something
  }
}

13

Orijinal olarak burada açıklananshift() Javascript yöntemini kullanarak bir Dizi içindeki çeşitli işlevleri yürütmenin daha kolay bir yolunu göndererek bu konuyu tamamlardım.

  var a = function(){ console.log("this is function: a") }
  var b = function(){ console.log("this is function: b") }
  var c = function(){ console.log("this is function: c") }

  var foo = [a,b,c];

  while (foo.length){
     foo.shift().call();
  }

7

Temelde aynıdır, Darin Dimitrov'sancak dinamik olarak işlevleri ve argümanları oluşturup depolamak için onu nasıl kullanabileceğinizi gösterir. Umarım sizin için yararlıdır :)

var argsContainer = ['hello', 'you', 'there'];
var functionsContainer = [];

for (var i = 0; i < argsContainer.length; i++) {
var currentArg = argsContainer[i]; 

  functionsContainer.push(function(currentArg){
    console.log(currentArg);
  });
};

for (var i = 0; i < functionsContainer.length; i++) {
  functionsContainer[i](argsContainer[i]);
}


1
Kaç kişi olursa olsun cevabınızı eklemekte sorun yoktur. Ancak bu konuda diğerlerinden farklı / daha iyi olan bir açıklama eklemek tercih edilir
Bowdzone

3

yukarıda bazılarını yinelemeli gördük. Aynı şeyi forEach kullanarak yapalım:

var funcs = [function () {
        console.log(1)
  },
  function () {
        console.log(2)
  }
];

funcs.forEach(function (func) {
  func(); // outputs  1, then 2
});
//for (i = 0; i < funcs.length; i++) funcs[i]();

1

Doğru

var array_of_functions = {
            "all": function(flag) { 
                console.log(1+flag); 
              },
                "cic": function(flag) { 
                console.log(13+flag); 
              }                     
        };

array_of_functions.all(27);
array_of_functions.cic(7);

1
Cevaplamak istediğin sorunun bu olduğundan emin misin? İlgili değil.
Bergi

1
@Bergi Aslında öyle. Cevabı operaile değiştirin ve array_of_functionsaynı şeyi elde edin. Şimdi nasıl?
Jesse 13

@Jesse teşekkürler, şimdi kodu göndermekle ilgili bir fikrim var, bu benim ilk cevabım.
Leonardo Ciaccio

Ancak OP'nin bir dizisi vardı, bu bir nesne iken (garip özellik adlarıyla)? Ve bu cevabın haberi nedir, neden sadece pjcabrera'nın veya Robin'inkine oy vermiyorsunuz?
Bergi

1
kafa karıştırıcı değişken adı. Bu bir işlev dizisi değil, işlevlerin bir nesnesi
Craicerjack

1

Geri aramaları dinamik olarak iletmeye çalışmak gibi bir şey yapıyorsanız, tek bir nesneyi bağımsız değişken olarak iletebilirsiniz. Bu, herhangi bir parametre ile hangi işlevleri yürütmek istediğiniz üzerinde size çok daha fazla kontrol sağlar.

function func_one(arg) {
    console.log(arg)
};

function func_two(arg) {
    console.log(arg+' make this different')
};

var obj = {
    callbacks: [func_one, func_two],
    params: ["something", "something else"];
};

function doSomething(obj) {
    var n = obj.counter
    for (n; n < (obj.callbacks.length - obj.len); n++) {
        obj.callbacks[n](obj.params[n]);
    }
};

obj.counter = 0;
obj.len = 0;
doSomething(obj); 

//something
//something else make this different

obj.counter = 1;
obj.len = 0;
doSomething(obj);

//something else make this different

1

ES6 geri araması yoluyla birçok işlevin yürütülmesi 🤗

const f = (funs) => {
  funs().forEach((fun) => fun)
}

f(() => [
  console.log(1),
  console.log(2),
  console.log(3)
])


0

Belki birine yardımcı olabilir.

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <script type="text/javascript">
        window.manager = {
            curHandler: 0,
            handlers  : []
        };

        manager.run = function (n) {
            this.handlers[this.curHandler](n);
        };

        manager.changeHandler = function (n) {
            if (n >= this.handlers.length || n < 0) {
                throw new Error('n must be from 0 to ' + (this.handlers.length - 1), n);
            }
            this.curHandler = n;
        };

        var a = function (n) {
            console.log("Handler a. Argument value is " + n);
        };

        var b = function (n) {
            console.log("Handler b. Argument value is " + n);
        };

        var c = function foo(n) {
            for (var i=0; i<n; i++) {
                console.log(i);
            }
        };

        manager.handlers.push(a);
        manager.handlers.push(b);
        manager.handlers.push(c);
    </script>
</head>
<body>
<input type="button" onclick="window.manager.run(2)" value="Run handler with parameter 2">
<input type="button" onclick="window.manager.run(4)" value="Run handler with parameter 4">
<p>
<div>
    <select name="featured" size="1" id="item1">
        <option value="0">First handler</option>
        <option value="1">Second handler</option>
        <option value="2">Third handler</option>
    </select>
    <input type="button" onclick="manager.changeHandler(document.getElementById('item1').value);" value="Change handler">
</div>
</p>
</body>
</html>

0

Hepsini çalıştırmanın kısa bir yolu:

[first_function, ..., nth_function].forEach (function(f) {
    f('a string');
}); 

0

bu işlev dizisinin sorunu "dizi biçiminde" değil, bu işlevlerin çağrılma biçiminde ... o zaman ... bunu deneyin .. basit bir eval () ile ...

array_of_function = ["fx1()","fx2()","fx3()",.."fxN()"]
var zzz=[];
for (var i=0; i<array_of_function.length; i++)
     { var zzz += eval( array_of_function[i] ); }

işte burada, üstte hiçbir şeyin evde işi yapmadığı yerde ... yardımcı olacağını umuyor


Diğer cevapların sizin için neden işe yaramadığını ve sizinki neden işe yaradığını açıklayabilir misiniz? Teşekkür ederim!
Fabio "Reinstate Monica" diyor

bana hatalar, tanımlanmamış işlevler, ya da kesinlikle javascript tarafından değerlendirilmiyorlar ... (neden bilmiyorum ama bu benim sorunumu çözdü)
Quetzal


evet, her zamanki gibi korkunç, ama atış çözümü ve özellikle bir "girdiden" uzaksa kullanımı oldukça kolay ... burada kısa bir yoldan iç javascript imkansızlığını çözdü ...
Quetzal

0

Function.prototype.bind () kullanma

var array_of_functions = [
        first_function.bind(null,'a string'),
        second_function.bind(null,'a string'),
        third_function.bind(null,'a string'),
        forth_function.bind(null,'a string')
    ]

0

Bunu çözmeye çalışırken birçok problemim var ... bariz olanı denedim ama işe yaramadı. Sadece bir şekilde boş bir işlev ekler.

array_of_functions.push(function() { first_function('a string') });

Bunu bir dizi dizge kullanarak ve daha sonra eval ile çözdüm:

array_of_functions.push("first_function('a string')");

for (var Func of array_of_functions) {
   eval(Func);
   }

0

Ah adamım çok tuhaf cevaplar var ...

const execute = (fn) => fn()
const arrayOfFunctions = [fn1, fn2, fn3]

const results = arrayOfFunctions.map(execute)

or if you want to sequentially feed each functions result to the next:
compose(fn3, fn2, fn1)

compose varsayılan olarak desteklenmez, ancak bu aracı sağlayan ramda, lodash ve hatta redux gibi kütüphaneler vardır


-1

yukarıda bazı en iyi cevapları aldınız. Bu, bunun başka bir versiyonu.

var dictFun = {
     FunOne: function(string) {
     console.log("first function");
  },

   FuncTwo: function(string) {
   console.log("second function");
 },

  FuncThree: function(string) {
   console.log("third function");
}

}


2
Soru, bir nesne değil, işlevler dizisi içindi .
trincot

-4
/* PlanetGreeter */

class PlanetGreeter {
    hello   : { () : void; } [] = [];
    planet_1 : string = "World";
    planet_2 : string = "Mars";
    planet_3 : string = "Venus";
    planet_4 : string = "Uranus";
    planet_5 : string = "Pluto";
    constructor() {
        this.hello.push( () => { this.greet(this.planet_1); } );
        this.hello.push( () => { this.greet(this.planet_2); } );
        this.hello.push( () => { this.greet(this.planet_3); } );
        this.hello.push( () => { this.greet(this.planet_4); } );
        this.hello.push( () => { this.greet(this.planet_5); } );
    } 
    greet(a: string) : void { alert("Hello " + a); }
    greetRandomPlanet() : void { 
        this.hello [ Math.floor( 5 * Math.random() ) ] (); 
    } 
} 
new PlanetGreeter().greetRandomPlanet();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.