配列メソッド

価格のリストがあり、各価格に税金を加えた2番目のリストが欲しいとしましょう。配列をループして合計を計算し、各結果を新しい配列にプッシュするforループを書くことはできます。それは動作しますが、小さなアイデアのための大量の配線です:すべてのアイテムを取り出して変更する。配列メソッドはこの種の作業のために組み込まれたツールです。ループを実行するループをつづることなく、リストに何をしたいかを言うことができ、この章では毎日使うメソッドをカバーしています。これらは配列と関数に直接構築されているため、両方を手元に置いておいてください。
map:すべてのアイテムを変更する
mapは**メソッド**です:配列に属し、それに対して作業を行う関数です。mapは各アイテムを与えた小さな関数を通して実行し、結果を収集することで新しい配列を構築します。その関数を渡すと、各アイテムを一度に1つずつ渡されます。
いくつかの価格があり、各価格を2倍にしたいとしましょう:
const prices = [2, 4, 6];
const doubled = prices.map((price) => price * 2);
console.log(doubled); // [4, 8, 12](price) => price * 2の部分はアロー関数です:1つのアイテム(price)を取ってそれが何になるべきかを返す短い関数です(price * 2)。mapはそれを各アイテムに対して一度呼び出し、各答えを新しい配列の同じ順序で置きます。
mapはリストを取り、同じ長さの新しいリストを与えます。すべてのアイテムが小さな関数を通して実行されます。アロー関数は各アイテムが何に変わるかを言い、mapはそれをすべての順序で行います。ループのみを書いてから2番目のリストを構築する場合は、常にそれを使用してください。 filter:通過したアイテムを保持する
mapがすべてのアイテムを変更するのに対し、filterは一部のみを保持します。各アイテムに対して「はい」または「いいえ」で答える関数を与え、filterは「はい」を得たアイテムのみから新しい配列を構築します。
const scores = [40, 75, 90, 55, 88];
const passing = scores.filter((score) => score >= 60);
console.log(passing); // [75, 90, 88]関数(score) => score >= 60は各スコアに対してtrueまたはfalseを返します。filterはtrueであるもの保持し、残りを削除します。新しい配列は元の配列より短くすることができ、順序は決して変わりません。
filterはテストに合格したアイテムを保持し、残りを削除するため、新しい配列はしばしば短くなります。あなたの関数は各アイテムについて「はい」または「いいえ」で答え、はいのみが通ります。順序は決して変わりません。生き残ったものは開始した順序のままです。 reduce:1つの値に絞る
mapとfilterは両方ともアレイを返します。reduceは配列を1つの値に折りたたむもので:合計、最大値、連結された文字列です。他より多くの人々を混乱させるため、ゆっくり進む価値があります。
reduceは配列を歩きながら、その結果を一緒に持ち歩きます。各アイテムで、「これまでの結果と、このアイテムを考えると、新しい結果は何か?」と尋ねます。
const prices = [10, 20, 30];
const total = prices.reduce((sum, price) => sum + price, 0);
console.log(total); // 60関数は2つのもの:sum(これまでの実行合計)とprice(現在のアイテム)を取得します。これはsum + priceを返し、次のアイテムの新しい実行合計になります。最後の0は合計が始まる場所です。そのため、0 + 10、その後10 + 20、その後30 + 30と行き、60に着地します。
reduceはリスト全体を通じて実行中の結果を携帯し、各アイテムで更新します。コールバックは、これまでの結果と現在のアイテムを取得し、新しい結果を返します。最後の引数は開始位置で、通常は合計のための0で、これはステップバイステップで大声で読んだ瞬間私にクリックしました。 find、some、およびevery
これら3つはfilterの親戚です:テストを配列全体に対して実行しますが、新しい配列の代わりに、より狭い質問に答えます。
findはテストに合格したすべてのリストではなく、最初のアイテムをあなたに与えます。someとeveryは配列全体についてのはい/いいえの質問に答えます。
const scores = [40, 75, 90, 55];
const firstPass = scores.find((score) => score >= 60);
console.log(firstPass); // 75
const anyPass = scores.some((score) => score >= 60);
console.log(anyPass); // true
const allPass = scores.every((score) => score >= 60);
console.log(allPass); // falsefindは最初の一致したアイテム(75)を返します。someは「何かアイテムが合格しましたか?」と尋ね、少なくとも1つが行われたためtrueを返します。everyは「すべてが合格しましたか?」と尋ね、40と55が行わなかったためfalseを返します。
findは、リスト全体ではなく、テストに合格した最初のアイテムをあなたに与えます。someは「誰か合格しましたか?」と尋ね、everyは「すべてが合格しましたか?」と尋ねます。両方ともtrueまたはfalseで答えます。1つのアイテムまたははい/いいえの答えが必要な場合、フィルタリングされた配列ではなく、これらを使用してください。 チェーン化と読みやすさの維持
上記のメソッドは、それらを組み合わせると報酬を得るデザインを共有しています:各メソッドは新しい値を返し、元の配列をそのままにします。
map、filterなどは、開始した配列を変更することはありません。新しい配列(または値)を提供し、元のままにします。
const prices = [10, 20, 30];
const doubled = prices.map((price) => price * 2);
console.log(doubled); // [20, 40, 60]
console.log(prices); // [10, 20, 30]mapとfilterは両方ともアレイを返すため、それらを並べることができます:最初にフィルター、次に生存者をマップします。
const prices = [10, 20, 30, 40];
const bigDoubled = prices.filter((price) => price >= 20).map((price) => price * 2);
console.log(bigDoubled); // [40, 60, 80]filterとmapは両方ともアレイを返すため、チェーン化することができます:最初にフィルター、次に左側をマップします。上から下へチェーンを読み、一度に1ステップ。 次に進むべきところ
map、filter、およびreduceは、リストで行う最大のものをカバーします:それを変換するか、狭くするか、または折りたたんでください。find、some、およびeveryは、より狭い質問に答えます。これらが自然に感じられたら、配列上のforループのほとんどは、あなたが意味したことを言う1つまたは2行に変わります。
次の自然なステップはオブジェクトで、配列はプレーンな数字と文字列よりも豊かなアイテムを保持し始め、これらの同じメソッドはそれらで動作し続けます。ここのコールバック構文のいずれかが不安定に感じた場合、関数を通して戻るパスは、残りをクリックします。

