LANG SELRCT

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

2018年6月23日土曜日

配列の文字列をユニークにして重複を抽出したい


やりたいこと
  1. inputに重複を含む文字列を入力(スプレッドシートなどからコピペ)すると
  2. uniqueの欄にはユニークにした文字列を抽出して
  3. dupの欄には重複する文字列を抽出する




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


  • オブジェクトの中から条件に一致する要素を抜き出す(filter)

  • デモ






    コード.gs
    function doGet() {
      return HtmlService.createHtmlOutputFromFile("index");
    }
    
    意訳
    この機能がやること
    指定したHTMLファイルを表示する
    
    



    index.html
    <!DOCTYPE html>
    <html>
      <head>
        <style>
          textarea {
            width: 240px;
            height: 360px;
          }
        </style>
      </head>
    <body>
      <textarea id="ta1" placeholder="input"></textarea>
      <textarea id="unique" placeholder="unique" disabled></textarea>
      <textarea id="dup" placeholder="dup" disabled></textarea>
    
    <script>
    function get_elem(id){
      return document.getElementById(id);
    }
    
    var ta1 = get_elem("ta1");
    var unique = get_elem("unique");
    var dup = get_elem("dup");
    
    ta1.onkeyup = ta_keyup;
    
    /************************************
    ta1にキーワード一覧をコピペすると
    uniqueにはta1のキーワードをユニークにしたものが出力される
    dupには重複するキーワードが出力される
    
    ユニークにしてカウントした時にcountが2以上のものをdupに入れる
    ************************************/
    function ta_keyup(){
      var values = ta1.value.split("\n");
      var match_count = get_unique(values);
      var desc = sort_obj(match_count);
      var filtered = get_filtered_obj(desc);
      unique.value = filtered["unique"].join("\n");
      dup.value = filtered["dup"].join("\n");
    }
    
    /************************************
    ユニークにしてカウントする
    ************************************/
    function get_unique(){
      var array = ta1.value.split("\n");
      var match_count = get_match_count(array);
      return match_count;
    }
    
    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"];
    }
    
    /************************************
    ユニークにした配列をuniqueに入れて、countが2以上ならdupの配列に入れて返す
    ************************************/
    function get_filtered_obj(obj) {
      var unique_filtered = obj.filter(judge_unique);
      var dup_filtered = obj.filter(judge_dup);
      var unique = get_result(unique_filtered);
      var dup = get_result(dup_filtered);
      var filtered = { "unique": unique, "dup": dup };
      return filtered;
    }
    
    //ユニークを返す
    function judge_unique(items) {
      var unique = items["count"];
      return unique;
    }
    
    //countが2以上のものを返す
    function judge_dup(items) {
      var dup = items["count"] >= 2;
      return dup;
    }
    
    function get_result(filtered) {
      var result = [];
      for (var i = 0; i < filtered.length; i++) {
        result.push(filtered[i]["text"]);
      }
      return result;
    }
    </script>
    </body>
    </html>