GASで簡単!配列と二次元配列の重複削除テクニック

GASを使っていると配列の重複を無くしたい時があるんだけど、どうしたらいいんだろう?
猫男
猫男
catman
catman
そんな時は、catmanがGASでの配列2次元配列重複削除について教えてやろう。簡単だぞ!

GASで配列の重複を削除する方法

まずは、GASで配列の重複を削除する基本的な方法を紹介しよう。

Setを使った重複削除

GASでは、Setを使うと簡単に重複を削除できる。


function removeDuplicates(arr) {
  return [...new Set(arr)];
}

const exampleArray = ['apple', 'banana', 'apple', 'orange'];
const uniqueArray = removeDuplicates(exampleArray);
Logger.log(uniqueArray); // ['apple', 'banana', 'orange']

ここで、Setは重複を許さない特性を持っているため、変換するだけで重複が消える。

つまり、

List(重複許す)

Set(重複許さない)

List(重複許す)

という処理をしてやると、Setにしたときに重複の要素が消滅してしまうわけさ。

日常生活に例えると、

「ダイエットして一度脂肪を落として、リバウンドして戻っても“あの時の脂肪”はない」

とも言えるな。

gas 配列 重複 削除

しかし、

「一度 Set にして削除した重複は復活しないが、同じような新しい値が追加される可能性はある」

とも言える。

forEachとfilterで重複削除

GASでは、forEachfilterでも重複を削除できるぞ。


function removeDuplicatesWithFilter(arr) {
  return arr.filter((element, index) => arr.indexOf(element) === index);
}

const newArray = removeDuplicatesWithFilter(exampleArray);
Logger.log(newArray); // ['apple', 'banana', 'orange']

arr.filter(...) は、元の配列 arr の各要素に対して関数を実行し、true を返した要素だけを新しい配列に残す。

(element, index) => arr.indexOf(element) === index
  • arr.indexOf(element) は、その要素が最初に登場した位置(インデックス)を返す。
  • index は、filter の現在のループでのインデックス。

つまり:

arr.indexOf(element) === index

→ 「この要素が初めて登場した場所か?」 をチェックしていることになる。

初めて登場する位置と一致しているときだけ true が返され、その要素だけが新しい配列に含まれるんだ。

なるほど、これなら配列の重複削除が簡単にできそう!
猫男
猫男

GASで2次元配列の重複を削除する方法

GASでの2次元配列における重複削除は、Mapを使うと便利だ。


function uniqueRows(arr) {
  const seen = new Map();
  return arr.filter(row => {
    const key = row.join(',');
    return seen.has(key) ? false : seen.set(key, true);
  });
}

const example2DArray = [
  ['apple', 1],
  ['banana', 2],
  ['apple', 1],
  ['orange', 3]
];
const unique2DArray = uniqueRows(example2DArray);
Logger.log(unique2DArray); // [['apple', 1], ['banana', 2], ['orange', 3]]

各行を文字列化し、それをキーとしてMapを使うことで重複する行を排除できる。

  • seen = new Map() は、すでに出てきた行を記録するための変数。
  • row.join(',') により、配列の行(例:['apple', 1])を 'apple,1' のような文字列に変換。
  • seen.has(key) で、すでに出現した行かどうかを確認します。
  • 初めての行であれば seen.set(key, true) により記録し、true を返してその行を残す。
  • 重複している行は false を返すことで削除。
Mapを使うと2次元配列でも簡単に重複が取り除けるのか!
猫男
猫男

 

えっ、Mapを忘れてしまった?

それなら、GASのMapの使い方も復習してみよう。

 

練習問題

次の配列と2次元配列の重複を削除するコードを書いてください。

  1. 配列:[3, 6, 3, 1, 2, 2, 5]
  2. 2次元配列:[[‘car’, 2], [‘bike’, 1], [‘car’, 2], [‘bus’, 4]]

解答・解説

以下に、配列と2次元配列の重複を削除するGASのコードを示します。


function test() {
  // 配列の重複削除
  const array = [3, 6, 3, 1, 2, 2, 5];
  const uniqueArray = [...new Set(array)];
  Logger.log(uniqueArray); // [3, 6, 1, 2, 5]

  // 2次元配列の重複削除
  const array2D = [['car', 2], ['bike', 1], ['car', 2], ['bus', 4]];
  const seen = new Map();
  const uniqueArray2D = array2D.filter(row => {
    const key = row.join(',');
    return seen.has(key) ? false : seen.set(key, true);
  });
  Logger.log(uniqueArray2D); // [['car', 2], ['bike', 1], ['bus', 4]]
}

1. Setを使えば、一瞬で配列内の重複をなくせる。GASでの一行力技だ。

2. 2次元配列の重複は、各行を連結して文字列化したキーを使ってMapで管理。見たことのあるキーを確認するだけで、重複を削除できる。効率的な手法だ。