前提
GASにて二次元配列を操作している際に、はまってしまったので、備忘録。
失敗例
当初、最下部の「参照」にて参考にしていたコードを使用していたが、thisがグローバルオブジェクトを指定してしまい、対象の配列データの一部でも先に定義されていた場合、機能しなくなる。
main.js
function getUniqueArray_2d(arr, num) {
arr = arr.filter(row => {
if (!this[row[num]] && row[num] != "") {
return this[row[num]] = true;
}
});
return arr
}
const arr = [
["A", "Bill", "1", "AAA"],
["A", "Alice", "3", "BBB"],
["A", "Chris", "4", "CCC"],
["B", "Chris", "5", "DDD"],
["B", "Chris", "6", "EEE"],
["C", "Davis", "7", "FFF"]
];
getUniqueArray_2d(arr, 1) // 重複判定する列番号を指定
なお、事前に定義されていない場合、正しいデータが取得できる。
修正
thisがグローバルオブジェクトを指定してしまうため、thisの代わりのオブジェクトを宣言してから実行する。
main.js
function getUniqueArray_2d(arr, num) {
const unique = {} // 空のオブジェクトを宣言
arr = arr.filter(row => {
if (!unique[row[num]] && row[num] != "") {
return unique[row[num]] = true;
}
});
return arr
}
これでうまくいきました。
参照