0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

map・filter・reduceの書き方・使い方

Last updated at Posted at 2020-09-06

Reactでポートフォリオ のアプリを作成し始めたのですが、
その時使った配列操作の map、filter、reduceについて、
書き方と使い方をまとめておきます。

※文法に集中する為、Reactの書き方は全て排除しJavaScriptのみでまとめてます。

mapメソッド

mapは元々の配列から操作して、新しい配列を作ります。

具体的な例はこんな感じ↓

incomeItems = [{text: "本の売却", amount: 500, id: 123343434}, {text: "宝くじ", amount: 5000, id: 123454523}]
const incomeAmounts = incomeItems.map(incomeItem => incomeItem.amount);
//結果 incomeAmounts = [500,5000]

incomeItemsはオブジェクトの配列です。
中にはユーザーが入力した「text」と「amount」、ランダムなIDが入ってます。
そのincomeItemsに対してmapメソッドを使ってます。

【アロー関数でのmapの書き方】
配列. map ( value => 新しい配列としてリターンしたい内容 )

第二引数にindex、第三引数に実行しているarray自身を入れることもできます
配列. map(( value, index, array ) => 新しい配列としてリターンしたい内容 )

mapを使ってincomeAmountsという数字だけを取り扱う用の配列が作れました。

filterメソッド

filterメソッドは条件に合致した要素で新しい配列を作ります。

今回のアプリでは、ユーザーがdeleteボタンを押した時に、その項目が削除されるという操作のため使いました。

具体的な例はこんな感じ↓

incomeItems = [{text: "本の売却", amount: 500, id: 1}, {text: "宝くじ", amount: 5000, id: 2}]

//onClickなどでdeleteHandlerを実行させる
const deleteHandler = () => {
  setIncomeItems(incomeItems.filter((e) => e.id !== incomeItem.id));
}
//結果: incomeItems = [{text: "宝くじ", amount: 5000, id: 2}]

incomeItemsにユーザーが入力した内容がオブジェクトの配列として入ってます。
その配列に対してfilterを実行し、各配列の要素(e)のidとincomeItemのid(
消したいitem)を比べてます。
idが一致しない要素だけのincomeItemsの配列が出来上がります。(=削除以外の項目)

【filterの書き方】
配列. filter ( ( element ) => 条件)

これもまた第二引数にindex、第三引数に実行中のarray自身を指定できます。
配列. filter ( ( element, index, array ) => 条件)

filterを使ってユーザーが削除した以外の要素を取り出せました。

#reduceメソッド
reduceは配列の各要素を一つにできます。累積系に便利ということです。
今回のアプリでは、配列の中にある数値の合計を出してみました。

具体的な例はこんな感じ↓

incomeAmounts = [500,5000]
const incomeTotal = incomeAmounts.reduce((acc, cur) => acc += cur, 0);
//結果: 5500

incomeAmountsの配列に対してreduceを実行してます。
reduceの第一引数(arr)は、前までに蓄積された値で、第二引数(cur)は、現在の値が入ります。
この場合「合計」を出したいので、蓄積の値(arr)と現在の値(cur)を足して一つの要素として返してます。

【reduceの書き方】
配列. reduce ( ( accumulater, current ) => 条件, 初期値)
今回の例では第二引数までで、0を初期値として渡してます。

なんと引数は4つまで渡せます。
配列. reduce ( ( acc, cur, idx, src ) => 条件, 初期値)
1: (acc) アキュムレーター。前までの蓄積された値
2: (cur) 現在値
3: (idx) インデックス
4: (src) 元々の配列


配列操作のメソッドはもっといっぱいあるで、色々使いながら学んでいきたいですね。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?