LANG SELRCT

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

2018年4月9日月曜日

配列内で重複する値の発生数を取得してオブジェクトで返す


var values = ["take", "your", "time", "take", "care", "of", "your", "take"]

上のような配列があって
この中で同じ値がいくつあるか


以下のようなオブジェクトで返したい

{"care":1,"of":1,"take":3,"time":1,"your":2}



コード.gs
function result(){
  var values = ["take", "your", "time", "take", "care", "of", "your", "take"];
  var obj = get_result_obj(values);
  Logger.log(JSON.stringify(obj));
}

function get_result_obj(values) {
  var num = 0;
  var word = [];
  var count = [];
  var obj = {};
  values = values.sort();
  for (var i = 0; i < values.length; i++) {
    if(i == 0){
      word.push(values[0]);
      count.push(1);
      num = 0;
    }else if(values[i] == values[(i-1)]) {
      count[num] = count[num] + 1;
    }else {
      word.push(values[i]);
      count.push(1);
      num = num + 1;
    }
    obj[values[i]] = count[num];
  }
  Logger.log([word, count]);
  return obj;
}
意訳
この機能がやること
配列を用意して
get_result_objに渡して
結果をJSON形式でログに出す


この機能がやること
numに0を入れて
wordの配列を用意して
countの配列を用意して
objという空のオブジェクトを用意して
渡されたvalues配列をソートして
配列の要素の数だけ以下を繰り返す
もし最初の処理なら(つまりiが0の場合)
word配列にvaluesの先頭(0番目)の値を追加して
countに1を追加して
numに0を入れる
もしi番目の値が1つ前の値と同じなら(つまり重複する値の場合)
count配列のnum番目の値に1を足す
それ以外なら
word配列にi番目の値を追加して
count配列に1を追加して
numに1を足す

objオブジェクトでvaluesのi番目の値をkeyとするプロパティのvalueに、count配列のnum番目の値を入れる(これで 単語: 件数の形になる)

word配列とcount配列をログに出して
objオブジェクトを返す