LANG SELRCT

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

2018年4月21日土曜日

配列内で重複する値の発生数を取得してオブジェクトを配列に入れて返す(発生件数の降順)


["ス", "モ", "モ", "も", "モ", "モ", "も", "モ", "モ", "の", "う", "ち"]

という配列から


重複件数が多い順に並べたオブジェクトを作りたい

 [
  {count=6.0, text=モ},
  {count=2.0, text=も},
  {count=1.0, text=う},
  {count=1.0, text=ち},
  {count=1.0, text=の},
  {count=1.0, text=ス}
]




コード.gs
function get_result(){
  var array = ["ス", "モ", "モ", "も", "モ", "モ", "も", "モ", "モ", "の", "う", "ち"];
  var result = get_match_count(array);
  var desc = sort_obj(result)
  Logger.log(desc);
}

function get_match_count(array){
  var sorted = array.sort();
  var arrays = [];
  var count;
  var unique_i;
  for(var i = 0; i < sorted.length; i++){
    var obj = {}
    var value = sorted[i];
    if(value === sorted[i-1]){
      count++;
      arrays[unique_i]["count"] = count;
    }else{
      count = 1;
      obj["text"] = value;
      obj["count"] = count;
      unique_i = arrays.length;
      arrays.push(obj);
    }
  }
  return arrays;
}

function sort_obj(arrays){
  var desc = arrays.sort(sorting);
  return desc;
}

function sorting(a, b){
  return b["count"] - a["count"];
}
意訳
この機能がやること
配列を用意して
get_match_countに渡して
結果をsort_objに渡して
ログに出す


この機能がやること
渡された配列をsortで並べ替えて(昇順)
結果を入れる配列を用意して
要素の重複件数を入れるcountの入れ物を用意して
要素を一意にした時のindexを指定するunique_iの入れ物を用意して
配列の数だけ以下を繰り返す
オブジェクトを新しく作る
配列内の値を一つずつ取得して
もしひとつ前の値と同じなら
countに1を足して
arrays内で現在targetにしているindexのcountの値に入れる
同じじゃなければ
countに1を入れて
obj{"text": value, 
"count": count}を作って
unique_iに現在のarraysの要素数を入れて(つまり一意の値の数)
arraysに追加して


出来上がったarraysを返す


この機能がやること
渡されたarraysのcountを降順に並べ替えた配列を
返す


この機能がやること
arrays内の値を比較して大きい順に並べ替えた配列に値を返す



実行結果