2015-12-19 32 views
5

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

+0

zmniejszyć konkatencję – dandavis

+0

Próbowałem użyć funkcji * zmniejszenia *, ale zwraca ona inną funkcję zamiast listy. Czy możesz podać mi przykład? –

+1

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

Odpowiedz

8

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]); 
1

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); 
+1

Dzięki za pomoc, ale życzyłem sobie funkcjonalnego sposobu na zrobienie tego. @dandavis ma rację. –

+1

@MateusFelipe to niesamowite. Niestety, nie użyłem Ramda.js – hargasinski

1

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] 
+0

@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 –