2015-12-19 17 views
5

La mia domanda è semplice. Ho iniziato recentemente con Ramda e mi piace, perché è puramente funzionale. Ho un piccolo problema con la funzione concat, in quanto accetta solo due elenchi come argomenti. Quindi, se ho bisogno di concatenare tre liste o più, devo concatenare funzioni come questa: concat(list1, concat(list2, concat(list3, list4))) (per una concatenazione di quattro liste). C'è un modo migliore per farlo, che non lo so? Grazie.Evita il doppio concat in Ramda

+0

ridurre il concat – dandavis

+0

ho provato ad usare * * ridurre la funzione, ma restituisce un'altra funzione al posto della lista. Puoi darmi un esempio? –

+1

http://bit.ly/1QRXCGf – dandavis

risposta

8

Se si desidera concatenare una lista di liste, è può ridurre la lista usando R.concat con una lista vuota come valore iniziale.

const concatAll = R.reduce(R.concat, []); 
concatAll([[1, 2], [3, 4], [5, 6]]); 

Oppure basta passare gli elenchi direttamente a R.reduce.

R.reduce(R.concat, [], [[1, 2], [3, 4], [5, 6]]); 

Se si desidera creare una nuova funzione variadic che prende ogni lista come argomento a parte, allora si può avvolgere la funzione con R.unapply.

const concatAll_ = R.unapply(R.reduce(R.concat, [])); 
concatAll_([1, 2], [3, 4], [5, 6]); 
1

Non ho usato la libreria Ramda, ma sembra che tu stia usando questo in node.js dalla documentazione che ho letto nel link che hai postato. In tal caso, è possibile utilizzare la variabile arguments in una funzione in node.js per scrivere la propria funzione concat che accetta n elenchi come input. La variabile arguments è essenzialmente una matrice degli argomenti immessi nella funzione.

function myConcat() { 
    for (var i = 1; i < arguments.length; i++) { 
    concat(arguments[0], arguments[i]); 
    } 
    return arguments[0]; 
}; 

In questo caso, tuttavia, si sarebbe probabilmente dovuto chiamare le cose come:

list1 = myConcat(list1, list2, list3, list4); 
+1

Grazie per aver cercato di aiutarti, ma desideravo un modo funzionale per farlo. @ Danandis ha capito bene. –

+1

@MateusFelipe è fantastico. Mi dispiace, non ho usato Ramda.js – hargasinski

1

A seconda di quello che stai concatenato e l'ambiente (ES2015 richiesto), si potrebbe fare:

const newList = [...list1, ...list2, ...list3]; 

In caso contrario, si è bloccato con più chiamate a concat, anche se si potrebbe rendere un po 'più pulita con Compose:

const newList = compose(concat(list1), concat(list2), concat(list4))(list3); 

davvero se si desidera mappare o meglio, ridurre:

const newList = reduce((acc, x) => concat(acc, x), [list3], [list4, list2, list1]); 

o che la funzione di ridurre interna potrebbe apparire come:

(acc, x) => [...acc, ...x] 
+0

@ScottChrisopher ridurre è più pulito, dimenticato di pointfree-ify mio concat. Tuttavia, concat non è davvero un grande esempio della componibilità di ramda come potremmo semplicemente chiamare concativamente con '[] .concat (a, b, c)', che è ciò che il codice ES2015 '[... a,. ..b, ... c] 'compila con babel –