2015-11-09 15 views
7

Stavo facendo alcuni esercizi di javascript online (codewars.com). Un problema ha chiesto all'utente di prendere una matrice di oggetti array e rimuovere un livello dall'intera matrice.Come funziona l'uso specifico di "[]" come parametro?

[] /* becomes */ [] 
[[1, 2, 3], ["a", "b", "c"], [1, 2, 3]] /* becomes */ [1, 2, 3, "a", "b", "c", 1, 2, 3] 
[[3, 4, 5], [[9, 9, 9]], ["a,b,c"]] /* becomes */ [3, 4, 5, [9, 9, 9], "a,b,c"] 

ho finito per imparare a conoscere il metodo concat, ma la soluzione più popolare usato questa dichiarazione ...

function (arr){ 
    return [].concat.apply([],arr); 
} 

Qualcuno può spiegare come utilizzare i [] qui? Non riesco a capire come questo produce i risultati corretti (e non fornisce spiegazioni sulla pagina). So che ci sono molte altre volte in cui vengono utilizzate parentesi vuote come parametri e array di etichette, quindi comprenderne l'utilizzo potrebbe aiutarmi a essere in grado di usarlo da solo in futuro.

risposta

7

Consente di suddividerlo su più righe in modo che sia più semplice da descrivere. La descrizione della linea D è in particolare quello che risponde alla tua domanda

[]   // A 
    .concat // B 
    .apply(// C 
     [], // D 
     arr // E 
    ); 
  • A è un Array, ma qui si tratta solo di essere usando come una scorciatoia per Array.prototype modo possiamo accedere ..
  • B Il concat metodo dal Array.prototype
  • C che poi invocare (usando apply) con un
  • Dthis argomento di una nuova Array, per essere la base oggetto e
  • E un elenco di argomenti, che era il nostro precedente arr

Quindi, si potrebbe ri-scrivere questo utilizzando Array.prototype e call come

var new_base_arr = []; 
Array.prototype.concat.call(
    new_base_arr, 
    arr[0], 
    arr[1], 
    ... 
    arr[n] 
); 

Il che potrebbe sembrare più familiare a voi scritto come

new_base_arr.concat(arr[0], arr[1], ..., arr[n]); 

Il problema da risolvere qui invoca una funzione con un numero indeterminato di argomenti.

+2

Ottima spiegazione! Mi ci sono voluti un paio di letture da quando stavi aggiornando mentre andavi. Non ero veramente sicuro dall'inizio se il '[]' in '[] .concat' e il' ([], arr) 'erano lo stesso oggetto matrice. La tua continuazione per abbattere la riscrittura usando 'Array.prototype' e' call' e come sembra "più familiare" per me, come se mi avessi davvero fatto capire. Grazie mille! – JoeL