最初に
初心者が書いています。個人的メモ程度に思ってみてください。
もし、他の解決法などがあれば教えていただけると嬉しいです。
Markdownの記法に慣れるための練習も兼ねています。
「普通はこういう書き方するよ!」みたいなアドバイスも頂ければ幸いです。
本題
連想配列内の値を同時に複数取り出したい時を考えます。
例えば以下のような連想配列があります。
const inventory = [{
name: "apple",
price: 120,
category: "fruits"
}
{
name:"bed",
price: 3000,
category: "furniture"
}
{
name: "chair",
price: 400,
category: "furniture"
}]
この中のIDが1と3の時の値を同時に取り出したい時、このように考えます。
const index = [1, 3];
const result = inventory.map(item => item.filter(i => i.id === index))
console.log(result)
しかし、この書き方だとエラーを吐きます。
Uncaught TypeError: item.filter is not a function
filter
が関数として見なされていないそうです。
調べてもよくわかりませんでした。
おそらくですが、mapメソッドの中で他のメソッドが使えないんだと思います。
(違ったら教えてください)
いろいろ試した結果、こうやったら動きました。
const result = inventory.filter(item => index.includes(item.id)).map(item => item["name"]);
console.log(result)
- 出力画面
// [object Array] (2)
["apple","chair"]
余談
配列の中から特定の条件を満たす要素を探すときにfindかfilterのどちらを使うべきかという話。
自分の感覚ではfilter
を使うべきなのかなと思いました。
というのも、
-
find
: 配列の要素の中から条件を満たす最も前の要素を1つだけ取り出す -
filter
: 配列の要素の中から条件を満たす全ての要素を取り出す
find
を使うと取りこぼしが発生してしまうのでfilter
を使うべきなのかなと。
一つしか入り得ないのならばfind
でもいいのかもしれないです。
こちらの方が要素を見つけ次第探索を終了するから処理が少なくなって良いのかな?