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
risposta
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]);
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);
Grazie per aver cercato di aiutarti, ma desideravo un modo funzionale per farlo. @ Danandis ha capito bene. –
@MateusFelipe è fantastico. Mi dispiace, non ho usato Ramda.js – hargasinski
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]
@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 –
ridurre il concat – dandavis
ho provato ad usare * * ridurre la funzione, ma restituisce un'altra funzione al posto della lista. Puoi darmi un esempio? –
http://bit.ly/1QRXCGf – dandavis