LANG SELRCT

コードを書く場所

2019年8月11日日曜日

複数の配列で共通する要素を取得したい(重複する要素を取得する)


以下のような3つの配列があって

  var A = [1, 2, 3, 11, 12];
  var B = [2, 16, 1, 3, 5, 4];
  var C = [3, 2, 16, 1, 12, 4, 7, 8, 9, 10];

共通する [1, 2, 3] を取得したい



コード.gs
function myFunction() {
  var A = [1, 2, 3, 11, 12];
  var B = [2, 16, 1, 3, 5, 4];
  var C = [3, 2, 16, 1, 12, 4, 7, 8, 9, 10];
  var arrays = [A, B, C];
  var duparray = getDuparray(arrays);
  Logger.log(duparray);
}

function getDuparray(arrays) {
  var duparray = arrays[0];
  for(var i = 0; i < arrays.length-1; i++) {
    Array.prototype.push.apply(duparray, arrays[i + 1]);
    duparray = duparray.filter(compareArrays);
  }
  return duparray;
}

function compareArrays(value_i, index, array){
  var value_i_index = array.indexOf(value_i);
  var result = value_i_index !== index;
  return result;
}



実行結果



補足

配列内に重複する要素がある場合
ユニークにしてからやらないと正確な結果を得られない

例えば以下のような配列を上のコード.gsで実行すると
var A = [3,13,19,29,59,61,69];
var B = [13,15,19,53,71];
var C = [4,6,6,7,7,8,8,13,13,19,53,53,57,57,60,60];

こうなる
 [6.0, 7.0, 8.0, 13.0, 13.0, 19.0, 53.0, 57.0, 60.0]

その対策として以下の コード2.gs のようにそれぞれの配列内の重複を除いてやると

こうなる
[13.0, 19.0]



コード2.gs
function myFunction() {
  var A = [3,13,19,29,59,61,69];
  var B = [13,15,19,53,71];
  var C = [4,6,6,7,7,8,8,13,13,19,53,53,57,57,60,60];
  var arrays = [A, B, C];
  arrays = getUniqueArrays(arrays);
  var duparray = getDuparray(arrays);
  Logger.log(duparray);
}

function getUniqueArrays(arrays) {// 配列内の重複をなくしてユニークにしてノイズを減らしておく(これやらないと正しくfilterされない)
  var uniqueValues = [];
  for(var i = 0; i < arrays.length; i++) {
    var array = getUniqueValues(arrays[i]);
    uniqueValues.push(array);
  }
  return uniqueValues;
}

function getDuparray(arrays) {
  var duparray = arrays[0];
  for(var i = 0; i < arrays.length-1; i++) {
    Array.prototype.push.apply(duparray, arrays[i + 1]);
    duparray = duparray.filter(compareArrays);
  }
  return duparray;
}

function compareArrays(value_i, index, array){
  var value_i_index = array.indexOf(value_i);
  var result = value_i_index !== index;
  return result;
}

function getUniqueValues(array){
  var uniqueRows = array.filter(compareUniqueValues);
  return uniqueRows;
}

function compareUniqueValues(value_i, index, array){
  var value_i_index = array.indexOf(value_i);
  var result = value_i_index === index;
  return result;
}



参考

Array.prototype.filter()