542
288

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.

4歳娘「パパ、20歳以上のユーザーを抽出して?」

Last updated at Posted at 2020-04-02

続編もよろしくやで!

ある日、ピクニックで訪れた山にて

娘(4歳)「パパ、見て!」

ワイ「なんや、娘ちゃん」

娘「あそこに、家族風のオブジェクトが落ちてるよ!」

JavaScript
const family = {
    mother: {
        name: "よめ太郎",
        age: 35
    },
    father: {
        name: "やめ太郎",
        age: 37
    },
    daughter: {
        name: "娘ちゃん",
        age: 4
    }
};

ワイ「おお、ほんまや!」
ワイ「mother、father、daughterの3人家族やな!」

娘「せっかくだから、この中から20歳以上のユーザーを抽出してみようよ!」

ワイ「おお!せっかくやからな!」
ワイ「やってみよか!」
ワイ「でも、家族のことをユーザーって呼ぶのはやめてな!」
ワイ「そんで、ええと」
ワイ「大人だけを抜き出したオブジェクトを作ればええんやったな!」
ワイ「ほな、やってみるで!」

JavaScript
const otona = {};

Object.keys(family).forEach(key => {
    const person = family[key];

    if (person.age >= 20) {
        otona[key] = person;
    }
});

娘「わぁ、すごい!」
娘「パパ、このコードがどういう意味だか説明して?」

ワイ「おお、ええで!」
ワイ「まず」

JavaScript
const otona = {};

ワイ「otonaって名前の空オブジェクトを作るんや」
ワイ「そこに、familyの中から20歳以上の人間だけを詰め直していくんや」

娘「うんうん」

ワイ「そのためにまず」
ワイ「Object.keys(family)を使って」
ワイ「familyというオブジェクトの、key名たちを配列として取得するんや」

娘「オブジェクトの、key名たちを取得・・・」
娘「ってことはつまり、Object.keys(family)は」
娘「["mother", "father", "daughter"]と同じってことだね!」

ワイ「その通りや!」
ワイ「せやから、↓こんなイメージや」

JavaScript
["mother", "father", "daughter"].forEach(key => {
    /* 省略 */
});

ワイ「↑こんな感じで、配列のforEachメソッドを使って」
ワイ「motherfatherdaughterと順番に回しながら」
ワイ「if文で20歳以上かどうか調べて」
ワイ「20歳以上の人間だけをotonaオブジェクトに詰め詰めしていくんや」

JavaScript
["mother", "father", "daughter"].forEach(key => {
    // keyには "mother" か "father" か "daughter" が入ってくる。
    const person = family[key];

    if (person.age >= 20) {
        otona[key] = person;
    }
});

ワイ「↑こんな感じやな」

娘「なるほど〜」

ハスケル子「イマイチですね」

ワイ「!?

ハスケル子も来ていた

ワイ「おお、ハスケル子ちゃん」
ワイ「ハスケル子ちゃんもこの山に遊びに来とったんか」

ハスケル子「はい、私もこの山に関数拾いに来ていました」

ワイ「おお、ほんまに好きやな〜」
ワイ「ところで、さっきのコードの何がイマイチなん?」

ハスケル子「うまくは言えませんが、私ならこう書きます」

JavaScript
const otona =
    Object.fromEntries(
        Object.entries(family)
            .filter(([, person]) => person.age >= 20)
    );

ワイ「Object.fromEntries()Object.entries()・・・」
ワイ「何なん、このメソッドたち・・・?」

ハスケル子「Object.entries()は、オブジェクトから配列を作ってくれるやつです」

ワイ「オブジェクトから配列を作る・・・?」

ハスケル子「はい」
ハスケル子「例えば、Object.entries(family)は・・・」

JavaScript
[
    ["mother", { name: "よめ太郎", age: 35 }],
    ["father", { name: "やめ太郎", age: 37 }],
    ["daughter", { name: "娘ちゃん", age: 4 }],
]

ハスケル子「↑これと同じ意味になります」

ワイ「へぇ〜、オブジェクトからこんな感じの配列を生成してくれるんや・・・」
ワイ「じゃあ、もう一つのObject.fromEntries()はどんなメソッドなん?」

ハスケル子「Object.fromEntries()は、さっきのObject.entries()の逆ですね」
ハスケル子「さっきObject.entries()で作った配列をObject.fromEntries()に渡してあげると」
ハスケル子「元のオブジェクトに戻ります」
ハスケル子「つまり・・・」

JavaScript
const obj = Object.fromEntries(
        Object.entries(family)
    );

ハスケル子「↑こうすると、変数objにはfamilyそのままのオブジェクトが入るってことです」

ワイ「ふーん」
ワイ「オブジェクトから一回配列を作って、その配列からまたオブジェクトを作る」
ワイ「そんなことして何が嬉しいん?」

ハスケル子「一度配列にすることによって」
ハスケル子「配列の持っているfilter()やらmap()やらのメソッドを使って」
ハスケル子「好きなように整形できるのが嬉しいですね」
ハスケル子「今回であれば、20歳以上の人間だけを抽出したい訳ですから」
ハスケル子「filter()メソッドが使えるじゃないですか」

JavaScript
Object.entries(family)
    .filter(([, person]) => person.age >= 20)

ハスケル子「↑こうしてフィルターしてやるんです」
ハスケル子「そうすると・・・」

JavaScript
[
    ["mother", { name: "よめ太郎", age: 35 }],
    ["father", { name: "やめ太郎", age: 37 }],
]

ハスケル子「↑こんな配列が出来上がります」
ハスケル子「この配列をObject.fromEntries()でオブジェクトに戻してあげると」

JavaScript
{
    mother: {
        name: "よめ太郎",
        age: 35
    },
    father: {
        name: "やめ太郎",
        age: 37
    }
};

ハスケル子「↑このように、20歳以上の人間だけが入ったオブジェクトになってる」
ハスケル子「っていう訳ですね」

ワイ「おお〜」

まとめ

  • Object.entries()を使うとオブジェクトから配列を生成できる。
  • Object.fromEntries()を使うと配列を元にオブジェクトを生成できる。
  • オブジェクトから一度配列に変換することで、配列の持っている便利なメソッドたちを使える。
  • オブジェクトを色々と整形したい時に便利。

ワイ「・・・↑こういうことやな!ハスケル子ちゃん」

ハスケル子「そんな感じです」

ワイ「おおきにやで!」
ワイ「また一つ賢くなったわ!」

〜おしまい〜

続編もよろしくやで!

542
288
13

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
542
288

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?