Se stai usando ES2015 piuttosto che solo uno spessore , è possibile utilizzare la notazione diffusione, Array.from
, e slice
:
function composeObj(objs) {
return Object.assign(...Array.from(arguments).slice(1));
}
o semplicemente utilizzando slice
direttamente piuttosto che dopo Array.from
:
function composeObj(objs) {
return Object.assign(...Array.prototype.slice.call(arguments, 1));
}
... vedere Thomas' answer utilizzando rest argomenti, poiché questo è il modo corretto di farlo in ES2015.
Se non stai usando ES2015, si può fare la stessa cosa con un solo spessorato Object.assign
via apply
:
function composeObj(objs) {
return Object.assign.apply(Object, Array.prototype.slice.call(arguments, 1));
}
C'è, stiamo usando Function#apply
anziché l'operatore spread (dal ES5 e precedenti non avere l'operatore di spread). Function#apply
chiama la funzione che viene chiamata utilizzando il primo argomento come this
durante la chiamata, e utilizzando l'array (o la cosa simile a una matrice) gli si fornisce come secondo argomento gli argomenti per la chiamata.
Quindi dire che avete:
obj.foo(1, 2, 3);
L'equivalente utilizzando Function#apply
è:
obj.foo.apply(obj, [1, 2, 3]);
Il primo argomento, obj
, dice apply
cosa usare come this
durante la chiamata. Il secondo argomento è un array di argomenti da usare.
Ma se si utilizza l'operatore di spread, non ce n'è bisogno, estende il suo operando di tipo array in argomenti discreti.
Hai già passato l'argomento dal secondo come 'arguments' è un array di argomenti passati alla funzione; – itzmukeshy7
@ itzmukeshy7: Non è un array, ma solo un array (che è rilevante per la domanda). Ma penso che l'esempio fosse solo per mostrare il concetto di cosa volevano fare. Il problema è che il numero di argomenti è variabile. –
@ le-moi 'arguments' è una matrice speciale che contiene tutti gli argomenti passati; – itzmukeshy7