web-dev-qa-db-ja.com

.map、.every、および.forEachの違いは何ですか?

私はいつもそれらの違いは何かと思っていました。彼らはすべて同じことをしているようです...

107
0x499602D2

違いは戻り値にあります。

.map()元のアイテムに対して何らかのアクションを実行することで作成されたオブジェクトの新しい配列を返します。

.every()booleanを返します-この配列のすべての要素が提供されたテスト関数を満たしている場合はtrueです。 .every()との重要な違いは、配列内のすべての要素に対してテスト関数が常に呼び出されるとは限らないことです。テスト関数が要素に対してfalseを返すと、それ以上配列要素は繰り返されません。したがって、通常、テスト関数には 副作用 を含めないでください。

.forEach()returns nothing-配列内の各項目に対して指定されたアクションを実行する配列を反復します。

これらおよび他の多くについて MDNでの配列反復法 をお読みください。

207
gilly3

gilly3の答えは素晴らしいです。他の種類の「要素をループする」機能に関する情報を少し追加したかっただけです。

  • .every() (反復子が最初にfalseまたはfalseyを返したときにループを停止します)
  • .some() (イテレータが最初にtrueまたは何らかの真実を返すときにループを停止します)
  • .filter() (フィルター関数がtrueを返す要素を含む新しい配列を作成し、falseを返す要素を省略します)
  • .map() (反復子関数によって返された値から新しい配列を作成します)
  • .reduce() (反復子を繰り返し呼び出して値を作成し、以前の値を渡します。詳細については仕様を参照してください。配列の内容や他の多くの内容を合計するのに便利です)
  • .reduceRight() (reduceと似ていますが、昇順ではなく降順で動作します)

クレジット:T.J. Crowder JavaScriptの配列のFor-each?

80

上記のすばらしい答えに対する別の考慮事項は、連鎖です。 forEach()では連鎖できませんが、map()では連鎖できます。

例えば:

var arrayNumbers = [3,1,2,4,5];

arrayNumbers.map(function(i) {
    return i * 2
}).sort();

.forEach()を使用すると、.sort()を実行できず、エラーが発生します。

5
Nadine Rose

Ramda の場合、 R.map()R.forEach() の違いは次のとおりです。

  1. R.forEach()は元の配列を返し、R.map()はファンクターを返します
  2. R.forEach()は配列に対してのみ操作できますが、R.map()はオブジェクトに対しても操作できます(つまり、オブジェクトのキー/値ペアは配列のように扱われます)
0
Michael Osofsky