【js(配列操作)】map()

map()とは

ループ処理
配列限定
foreachとの違いは”返り値”を返すのでreturnの記述を忘れずに

書き方

配列の変数+.map(コールバック関数);

  <button>処理開始</button>
//ある配列がある
let items = [5,10,15,20,25];

//mapのループ処理の中で各値を2倍にして返している
$('button').click(function(){   
   
  let result = items.map(function(value){
     return value * 2 ;
   });

   console.log(result);

});

【結果】
前: [5, 10, 15, 20, 25]
後:[10, 20, 30, 40, 50]

【解説】
map内の処理を、配列すべての値に対してループ処理で行っている。
必ず、returnは記述すること。

★.map箇所を.foreachにすると、たとえreturnを記述していても、返り値がundefinedになる。
返り値が必要な場合はとにかく「.map」!!


「map」のコールバック関数の応用でさらに便利に…!

value, index, array

「map」のコールバック関数の引数にvalue, index, arrayを入れるとそれぞれ下記。

・「value」は、配列の値
・「index」は、配列のインデックス番号
・「array」は、現在処理している配列

【使いどころ】
index番号を何かしらの条件にする必要がある時。
例)偶数番目の値を2倍にする。

補足:
index番号は0開始なので、仮に配列の先頭を”1つ目”としてカウントする場合は、
index番号が(「配列の値が」ではない)偶数ではない時に値を2倍するという記述になるので注意。

  <button>処理開始</button>
//ある配列がある
let items = [5,10,15,20,25];

//mapのループ処理の中で各値を2倍にして返している
$('button').click(function(){   

  let result = items.map(function( value,index,array ){
      if(index % 2 !== 0){
        return value * 2 ;
      }else{
        return value ;
      }
  });
   console.log(result);

});


【結果】
前:[5, 10, 15, 20, 25]
後:[5, 20, 15, 40, 25]
※見た目上で偶数番目だけ、2倍になっている。

【解説】
map内の処理を、配列すべての値に対してループ処理で行っている。
必ず、returnは記述すること。


ちなみに、「map」は元の配列データに一切変更を加えない特徴がありますが、3つ目の引数「array」を利用すれば、元のデータそのものを変更することも可能です!(グローバル変数のイメージなので関数外でも使える)

//ある配列がある
let items = [5,10,15,20,25];

//mapのループ処理の中で各値を2倍にして返している
$('button').click(function(){   
   
  items.map(function(value,index,array){
    array[index] =  value * 2 ;
   });

   console.log(items);

});

第二引数にオブジェクトを入れる

ループ処理に、別のオブジェクトの情報と関連付けて処理したい。
例)ある生徒たちの出身校を、一覧で表示したい。

【使いどころ】
あるオブジェクトがある。
そのオブジェクトを軸にユーザーのアクションごとに動的にオブジェクトの値を活用したいとき。
※オブジェクトだけでなく、変数などもOK!

<h1>出身校表示</h1>
<button>出身校検索</button>
<div>
    <ul id="show-list">
    </ul>
</div>
//生徒と出身校のオブジェクト
const ROSTER = {
  '田中太郎' : '東京大学',
  '鈴木洋一' : '神奈川大学',
  '澤田和樹' : '明治学院大学',
  '巻楓' : '専修大学',
  'ユリン' : '一橋大学',
  '本田啓介' : '法政大学',
  '長谷部隼' : '関西大学',
  '横山美咲' : '宮崎大学',
};

//ある生徒たちのグループ
let students_groupA = ['鈴木洋一', '澤田和樹', 'ユリン', '横山美咲']; 


//group_A配列の生徒の出身校を出したい
$('button').click(function(){   
    
    //出身校配列の作成
    let groupA_schools = students_groupA.map(function(student){
                            return ROSTER[student];
                        },ROSTER);

    //ループ処理でHTMLで表示
    groupA_schools.forEach(function(school_name){
      //let ID_show_list = document.getElementById('show-list');
      $('#show-list').append('<li>' + school_name + '</li>');
    });


});


【結果】
f:id:aruku-hito:20191219212859p:plain


参考記事
https://www.sejuku.net/blog/21887www.sejuku.net