Omdannelse av en matrise til en funksjons argumenter liste

stemmer
207

Er det mulig å konvertere en matrise i Javascript inn i en funksjon argument sekvens? Eksempel:

run({ render: [ 10, 20, 200, 200 ] });

function run(calls) {
  var app = .... // app is retrieved from storage
  for (func in calls) {
    // What should happen in the next line?
    var args = ....(calls[func]);
    app[func](args);  // This is equivalent to app.render(10, 20, 200, 200);
  }
}
Publisert på 22/08/2009 klokken 16:29
kilden bruker
På andre språk...                            


5 svar

stemmer
238

Ja. Det er lurt å bruke .apply()metoden. For eksempel:

app[func].apply( this, args );

EDIT - Som manixx påpeker nedenfor, de rettet ES6 kan bruke denne kortere syntaks:

app[func]( ...args );

Les deg opp på begge metoder på MDN: .apply () , spre "..." operator

EDIT - Original svar spesifisert this||windowsom første argument i .apply()versjon. I nettlesere, thisvedtar å windowhvis kalt utenfor en metode uansett, og windower også browser-spesifikke, så la oss bli kvitt den.

Svarte 22/08/2009 kl. 16:33
kilden bruker

stemmer
23
app[func].apply(this, args);
Svarte 22/08/2009 kl. 16:34
kilden bruker

stemmer
12

Du ønsker kanskje å ta en titt på et lignende spørsmål lagt ut på Stack Overflow. Den bruker .apply()metoden for å oppnå dette.

Svarte 22/08/2009 kl. 16:34
kilden bruker

stemmer
105

En svært lesbar eksempel fra et annet innlegg på lignende tema:

var args = [ 'p0', 'p1', 'p2' ];

function call_me (param0, param1, param2 ) {
    // ...
}

// Calling the function using the array with apply()
call_me.apply(this, args);

Og her er en link til det opprinnelige innlegget som jeg personlig likte for sin lesbarhet

Svarte 25/02/2014 kl. 11:18
kilden bruker

stemmer
1

@bryc - ja, kan du gjøre det slik:

Element.prototype.setAttribute.apply(document.body,["foo","bar"])

Men det virker som mye arbeid og tåkelegging i forhold til:

document.body.setAttribute("foo","bar")
Svarte 29/10/2015 kl. 03:13
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more