Moje pytanie jest proste. Niedawno zacząłem od Ramda i podoba mi się to, ponieważ jest to czysto funkcjonalne. Mam mały problem z funkcją concat, ponieważ przyjmuje ona tylko dwie listy jako argumenty. Tak więc, jeśli potrzebuję połączyć trzy listy lub więcej, muszę łączyć funkcje takie jak ta: concat(list1, concat(list2, concat(list3, list4)))
(dla czterech listowań). Czy jest jakiś lepszy sposób na zrobienie tego, czego nie wiem? Dzięki.Unikaj podwójnego konkatatu w Ramdzie
Odpowiedz
Jeśli chcesz złączyć listę list, ty może zmniejszyć listę przy użyciu R.concat
z pustą listą jako wartością początkową.
const concatAll = R.reduce(R.concat, []);
concatAll([[1, 2], [3, 4], [5, 6]]);
Lub po prostu przekazać listy bezpośrednio do R.reduce
.
R.reduce(R.concat, [], [[1, 2], [3, 4], [5, 6]]);
Jeśli chcesz utworzyć nową funkcję o zmiennej liczbie argumentów, które ujmuje się jako oddzielne listy argumentów, można owinąć funkcję z R.unapply
.
const concatAll_ = R.unapply(R.reduce(R.concat, []));
concatAll_([1, 2], [3, 4], [5, 6]);
Nie korzystałem z biblioteki Ramda, ale wydaje się, że używasz tego w pliku node.js z dokumentacji, którą przeczytałem w zamieszczonym przez ciebie linku. W takim przypadku można użyć zmiennej arguments
w funkcji w node.js
, aby napisać własną funkcję concat
, która pobiera n list jako dane wejściowe. Zmienna arguments
jest w istocie tablicą argumentów wprowadzanych do funkcji.
function myConcat() {
for (var i = 1; i < arguments.length; i++) {
concat(arguments[0], arguments[i]);
}
return arguments[0];
};
W tym przypadku jednak, prawdopodobnie trzeba nazwać to lubią:
list1 = myConcat(list1, list2, list3, list4);
Dzięki za pomoc, ale życzyłem sobie funkcjonalnego sposobu na zrobienie tego. @dandavis ma rację. –
@MateusFelipe to niesamowite. Niestety, nie użyłem Ramda.js – hargasinski
zależności od dokładnie to, czego złączenie i środowisko (wymagane ES2015), można zrobić:
const newList = [...list1, ...list2, ...list3];
W przeciwnym razie utkniesz w wielu połączeniach, aby konkatować, ale możesz zrobić to trochę czystsze z komponować:
const newList = compose(concat(list1), concat(list2), concat(list4))(list3);
naprawdę jednak chcesz map lub lepszy, obniżyć:
const newList = reduce((acc, x) => concat(acc, x), [list3], [list4, list2, list1]);
lub że funkcja wewnętrzna zmniejszyć mógłby wyglądać następująco:
(acc, x) => [...acc, ...x]
@ScottChrisopher reduce is cleaner, zapomniałem pointfree-ify my concat. Jednak konkat nie jest tak naprawdę świetnym przykładem kompozycyjności ramdy, ponieważ moglibyśmy po prostu wywołać połączenie concatatywnie z '[] .concat (a, b, c)', który jest tym, co kod ES2015 '[... a,. ..b, ... c] 'kompiluje się z babel –
zmniejszyć konkatencję – dandavis
Próbowałem użyć funkcji * zmniejszenia *, ale zwraca ona inną funkcję zamiast listy. Czy możesz podać mi przykład? –
http://bit.ly/1QRXCGf – dandavis