2015-12-19 16 views
5

私の質問は簡単です。私は最近Ramdaで始まりました。私はそれが好きです、それは純粋な機能だからです。 concat関数では、引数として2つのリストしか受け付けないため、少し問題があります。したがって、3つ以上のリストを連結する必要がある場合は、concat(list1, concat(list2, concat(list3, list4)))(4リスト連結の場合)のような関数を連結する必要があります。これを行うためのより良い方法はありますか?わかりません。ありがとう。ラムダでダブルコンカットを避ける

+0

concatを減らす – dandavis

+0

* reduce *関数を使用しようとしましたが、リストの代わりに別の関数を返します。あなたは私に例を挙げることができますか? –

+1

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

答えて

8

、あなた空のリストを初期値としてR.concatを使用してリストを減らすことができます。

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

R.reduceに直接リストを渡すだけです。

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

あなたは別々の引数として各リストを取り、新しい可変引数関数を作成する場合は、R.unapplyと機能をラップすることができます。

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

私はRamdaライブラリを使用していませんが、あなたが投稿したリンクで読んだドキュメントのnode.jsでこれを使用しているようです。その場合、node.jsの関数内のarguments変数を使用して、n個のリストを入力として受け取る独自のconcat関数を書くことができます。 arguments変数は、基本的に関数に入力された引数の配列です。この場合

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

しかし、あなたはおそらく好きで、それを呼び出す必要があります:あなたが連結し、ご使用の環境を正確内容に応じて

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

助けてくれてありがとう、しかし私はこれを行うための機能的な方法を望んでいた。 @dandavisはそれを正しく得た。 –

+1

@MateusFelipeそれは素晴らしいです。申し訳ありませんが、私はRamda.jsを使用していません – hargasinski

1

(ES2015が必要)、あなたができる:

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

そうしないと、コンカットを複数回呼び出すことができなくなりますが、作成するときれいにすることができます。

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

本当にあなたがマップしたり、より良い、減らしたいのに:

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

またはその内部の機能を削減するには、次のようになります。あなたはリストのリストを連結したい場合は

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

@ScottChrisopherはクリーナーを減らしていますが、私のコンカットをポイントフリーにするのを忘れました。しかし、concatは実際にはラムダの合成能力の素晴らしい例ではありません。コールコンカットを '' .concat(a、b、c) 'でネイティブに呼び出すことができます。これはES2015コード[... a、。 ..b、... c] 'をbabelでコンパイルする –

関連する問題