配列処理(mapメソッド)
はじめに
今後しばらくの間、配列処理のメソッドについての記事を残します。(以降掲載予定のメソッドはfilter,find,every,some,reduce,includes)
またこれらのメソッドはforEachで書き換え可能ですが、forEachは実行するだけで値を返さないというデメリット(デメリットと感じるのは僕個人の見解です)を持っています。
なので基本的には上記の配列処理メソッドに頼って、どうしてもという時にforEachを使うといった方針で配列を処理しようと思います。
mapの基礎構文
map内コールバック関数の引数は最大3つの引数を設定できます。
第1引数は、配列の一つ一つの要素。第2引数は、index(0からの添字)。第3引数は配列自体。
第1引数はよく使いますが第2、第3引数はあまり使わないといった印象です。
const data = [2, 4, 6, 8]; const result1 = data.map((value) => { return value * value; }); const result2 = data.map((_, index) => { return index; }); const result3 = data.map((_, __, array) => { return array; }); console.log(result1);//[4, 16, 36, 64] console.log(result2);//[0, 1, 2, 3] console.log(result3); //0: (4) [2, 4, 6, 8] //1: (4) [2, 4, 6, 8] //2: (4) [2, 4, 6, 8] //3: (4) [2, 4, 6, 8]
mapメソッドを用いた例題
①次の連想配列(images)のheightだけを取得し、新しい配列(heights)を作成しなさい。
type Images = { height: string; width: string; }[]; const images: Images = [ { height: "20px", width: "40px" }, { height: "34px", width: "56px" }, { height: "28px", width: "64px" }, ];
解答
const heights = images.map(({ height }) => {//オブジェクトの分割代入の利用 return height; });
②次の連想配列(member)の中から名前(name)の値だけを抜き取った配列が返るような関数getNameを作成しなさい。
type Members = { name: string; age: number; sex: "male" | "female"; }[]; const members: Members = [ { name: "松井", age: 39, sex: "male" }, { name: "今田", age: 34, sex: "female" }, { name: "鈴木", age: 24, sex: "male" }, { name: "山田", age: 56, sex: "male" }, { name: "田中", age: 89, sex: "female" }, ];
解答
type GetName<T extends Members, U> = (array: T) => U[]; const getName: GetName<Members, string> = (array) => { return array.map(({ name }) => name); }; console.log(getName(members)); //["松井", "今田", "鈴木", "山田", "田中"]