0
1

More than 1 year has passed since last update.

【JavaScript】find,findIndex,filterによる配列オブジェクト加工例

Posted at

やりたかったこと

指定したプロパティのvalueを持つ要素にだけ、追加でpushなどをしたかった時の実装方法について少し時間がかかってしまったのでその備忘録です。
例えば、下記のようなデータがAPIから返ってくるとます。

 const data = [
        {
          date: "2022-12-11",
          messages: [
            {
              text: "メッセージデータ1-1",
              creatTime: "10:00",
            },
          ],
        },
        {
          date: "2022-12-12",
          messages: [
            {
              text: "メッセージデータ2-1",
              creatTime: "11:00",
            },
            {
              text: "メッセージデータ2-2",
              creatTime: "12:00",
            },
          ],
        },
        {
          date: "2022-12-13",
          messages: [
            {
              text: "メッセージデータ3-1",
              creatTime: "10:00",
            },
          ],
        },
      ];

日付が一致したオブジェクトのmessagesプロパティにのみ、新しいメッセージとしてオブジェクトを追加します。
そのような時にfind,findIndexを用いることで実装が可能です。

find(),findIndex()

find()はコールバック関数を引数に持ちます。
booleanとなる条件を設定し、それを満たす配列内の一番最初の要素のみ返します。
findIndex()は、そのindex番号を返すという違いです。

find()の場合

const find = data.find((item) => item.date === "2022-12-12");
console.log(find); // → {date: '2022-12-12', messages: Array(2)}
find.messages.push({
        text: "メッセージデータ2-3",
        creatTime: "13:00",
    });
});

findIndex()の場合

const findIndex = data.findIndex((item) => item.date === "2022-12-12");
      console.log(findIndex); // → 1
      data[findIndex].messages.push({
        text: "メッセージデータ2-4",
        creatTime: "14:00",
      });

dataconsoleすると指定した2022-12-12の日付をもつ要素にだけ新しいデータをpushすることができました。
スクリーンショット 2022-12-17 8.08.26.png

filter()

filter()も同様にコールバック関数を引数に持ち、booleanとなる条件を設定します。
それを満たす配列内の全ての要素を抽出した新しい配列を生成します。
今回やりたかったこととは少し違いますね。

 const filter = data.filter((item) => {
    return item.date === "2022-12-13";
});

スクリーンショット 2022-12-17 8.23.30.png

まとめ

複雑?なデータの加工や抽出はまだ時間がかかってしまいますが、いろんなメソッドを知っておくと素早くやりたいことがコードに落とし込めそうですね。
配列内に値が存在するかどうかを調べる必要がある場合は、includes()、指定したテスト関数を満たす要素があるかどうかを調べる必要がある場合は、some()を使用できるとのことです✍🏻

0
1
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
1