2017-01-27 14 views
2

単純な例では、配列の配列を返したい。 'peeps'の各名前については、 'hello'という単語の配列をアキュムレータにプッシュしたいと思います。.reduce()関数でアキュムレータにプッシュした結果を返すことができないのはなぜですか?

const peeps = ['sally', 'nick', 'dave']; 

return peeps.reduce((acc, val) => { 
    return acc.push(['hello']) 
    }, []); 

acc.push()は関数ではありません。

誰かがなぜこれがうまくいかないのか理解してもらえますか?

+0

私はreduce関数内に空の配列を作成し、それをプッシュして代わりに配列を返すことができることを認識しています。しかし、私はそれが少しハックのように感じることなく動作しない理由を理解したいと思います。 –

+0

あなたは 'acc.concat(['hello']);'を返すことができます。 –

+1

'それぞれの名前に対して' ... forEachまたはmapはこの場合、より良いオプションのように見えます。減らすのは...まあ...減らす配列ですか? – sinisake

答えて

6

あなたはArray#push

を使用push()方法は、アレイの端部に一つ以上の要素を追加し、配列の新しい長さを返します。

これは、プッシュした後の配列の長さを返します。次に、累算器の値は配列ではなく数値になります。

return acc.push(['hello']) // 1 

解決策1:プッシュした結果ではなく配列を返します。

const peeps = ['sally', 'nick', 'dave']; 
 

 
console.log(peeps.reduce((acc, val) => { 
 
    acc.push(['hello']); 
 
    return acc; 
 
}, []));

解決方法2:使用Array#concat

concat()方法は、2つの以上の配列をマージするために使用されます。このメソッドは既存の配列を変更するのではなく、代わりに新しい配列を返します。

プッシュよりも効率が低いので、大量のデータを使用することは避けています。 jsPerf

const peeps = ['sally', 'nick', 'dave']; 
 

 
console.log(peeps.reduce((acc, val) => acc.concat([['hello']]), []));

解決策3:使用Array#map。結果配列の長さが指定された配列と同じである必要がある場合は、これが最適です。

map()方法は、配列の全ての要素に与えられた関数を呼び出した結果、新しい配列を作成します。

const peeps = ['sally', 'nick', 'dave']; 
 

 
console.log(peeps.map(val => ['hello']));

1

代わりにこれを試してみてください:

const peeps = ['sally', 'nick', 'dave']; 

return peeps.reduce((acc, val) => { 
    acc.push(['hello']); 
    return acc; 
}, []); 

pushは、あなたがそれを手動で行う必要があり、ACCを返しません。

1

私はあなたがマップを試すべきだと思います。減らす代わりに。

const peeps = ['sally', 'nick', 'dave']; 

return peeps.map((val) => { 
return ['hello'] 
}); 

それは、配列[ ['Hello'],['Hello'],['Hello'] ]

配列から単一の値を取得するために使用される削減を返します。たとえば、数、合計、製品などです。

+0

私の質問を説明するための工夫された例だったので、私はreduceの文脈でそれを理解する必要があった。あなたは正しいですが、マップは私の愚かな例の方が良いです。 –

関連する問題