LANG SELRCT

コードを書く場所についてはこちら

2018年4月21日土曜日

配列内の要素をfilterでユニークにしたい


 ["す", "も", "も"]

という配列から重複を除いた

 ["す", "も"]

という配列を作りたい



コード.gs
function get_unique(){
  var values = ["す", "も", "も"];
  var unique = values.filter(return_unique);
  Logger.log(unique);
}

function return_unique(value_i, index, array){
  var value_i_index = array.indexOf(value_i);
  var result = value_i_index === index;
  return result;
}
意訳
この機能がやること
重複を含む配列
重複のない一意の配列にして
ログに出す


この機能がやること(配列の各値, そのindex番号, 配列自身)
渡された値を配列の中で探して、最初に見つかったindex番号を取得して
引数で渡されているindex番号と同じかどうか判定して
結果をtrueかfalseで返す(trueの場合は新しい配列に値が追加される)



実行結果



補足


どういう動きをしているのか考えてみた


filterを使って
配列内で前から順番に値を探して
見つかった値のindex位置と
現在探している値のindex位置が同じなら
trueを返して新しい配列に追加する


配列が ["す","も","も"] の場合

arrayindexarray[index]indexOf(array[index])indexOf(array[index]) === index
["す","も","も"]0["す","も","も"]→す["す","も","も"]→00 === 0 → true
["す","も","も"]1["す","も","も"]→も["す","も","も"]→11 === 1 → true
["す","も","も"]2["す","も","も"]→も["す","も","も"]→11 === 2 → false


get_unique(value_i, index, array)
がやっていることをみると


0. get_unique("す", 0, ["す","も","も"])
["す","も","も"].indexOf("す")→0番目に見つかって、渡されたindexも0なのでtrueが返る


1. get_unique("も", 1, ["す","も","も"])
["す","も","も"].indexOf("も")→1番目に見つかって、渡されたindexも1なのでtrueが返る


2. get_unique("も", 2, ["す","も","も"])
["す","も","も"].indexOf("も")→1番目に見つかるが、渡されたindexは2なのでfasleが返る