2016-10-12 18 views
1

私は最近、reduceの機能を学びました。非常に便利でした。最近、一連の文字列を使って自動的に一連の出力を作成しました。以下のようなものに`reduce`メソッドの高度な使い方

miscArray = ["dog", "cat", "hamster"] 

:私のような何かを変えたい、しかし

miscString = 
"\nYou have a dog. 
\nYou have a cat. 
\nYou have a hamster." 

減らすことは、配列の最初の反復に、関数の適用されません。私はこのような何かを得るに終わる

function outputString(x,y){ 
    return x+"\nYou have a "+y+"."; 
} 

miscArray = ["dog", "cat", "hamster"] 

alert(miscArray.reduce(outputString)); 

:私のコードは次のようなものに見える場合は、回避策として

"dog 
\nYou have a cat. 
\nYou have a hamster." 

を、私はそうのような私の配列の先頭に空の文字列を使用してきました:miscArrray = ["","dog", "cat", "hamster"]。しかし、回避策を使用すると、正しいことをやり遂げる方法がわからないことを意味します。私はちょうどreduce()メソッドの私の変種を作ることを検討していますが、もしそれが正しい/より良い方法があれば。私はむしろそれをそうするだろう。

答えて

4

確かにあります:

あなたは、アキュムレータの初期値を指定する必要があります。あなたの場合は''(空文字列)です。アキュムレータの初期値がそのように一緒に2番目のパラメータとして第一の配列項目と、それが最初の繰り返しの最初の引数として渡される設定され

function outputString(x,y){ 
    return x+"\nYou have a "+y+"."; 
} 

miscArray = ["dog", "cat", "hamster"] 

alert(miscArray.reduce(outputString, '')); 

実際にはに常に習慣があります。常にはアキュムレータを明示的に設定しています。これは、式の入力がはっきりと明瞭になるからです。

+0

完璧な、それは私が必要としたものです。ありがとう!私は確かに将来それを使用します。 – Ucenna

3

この場合はreduceを使用しないでください。以下を使用してください:

miscArray.map(x => "\nYou have a "+ x +".").join("") 
+2

技術的に言うと、 'join'は縮小操作です。 – Phil

+2

@Phil' map'もreduce操作です:-) 'Array.prototype.reduce'は他のすべての配列演算を表現するのに十分です。 – zerkms

+1

あなたは '.join(" ")'を意味しました、そうですか? '.join()'は '.join("、 ")'と同じです。 – Bergi

関連する問題