LoginSignup
0
2

More than 1 year has passed since last update.

【GAS】複数の二次元配列から、重複していない配列を抽出する【XOR】

Last updated at Posted at 2020-06-03

要旨

・JavaScriptのsome()とevery()はいいぞ、any/allはいいぞ
2022/11/03 よりよい方法に置換

2つの二次元配列から、重複していない配列を取得(XOR)

比較したい二次元配列の子にあたる配列の長さが一致している場合は、こういうやり方がありました。

const ary01 = [ [1, 2, 3], [1, 3, 7], [4, 5, 6], [7, 8, 9], [10, 11, 12] ];
const ary02 = [ [1, 2, 3], [1, 3, 9], [4, 5, 6], [7, 8, 9] ];

// [1, 3, 7], [1, 3, 9], [10, 11, 12]だけ取りてえ!
const output = [...ary01, ...ary02].filter((value, _, array) => 
  array.filter((row) => row.every((cell,i) => cell === value[i])).length == 1
);
console.log(output);
// [[1, 3, 7], [10, 11, 12], [1, 3, 9]]

これでもいける

const ary01 = [ [1, 2, 3], [1, 3, 7], [4, 5, 6], [7, 8, 9], [10, 11, 12] ];
const ary02 = [ [1, 2, 3], [1, 3, 9], [4, 5, 6], [7, 8, 9] ];

// [1, 3, 7], [1, 3, 9], [10, 11, 12]だけ取りてえ!
const output = [...ary01, ...ary02].filter((value, _, array) => 
  array.filter((row) => JSON.stringify(value) === JSON.stringify(row)).length == 1
);
console.log(output);
// [[1, 3, 7], [10, 11, 12], [1, 3, 9]]

これ↓でもできないことはない

//面倒くさいやり方
const ary01 = [ [1, 2, 3], [1, 3, 7], [4, 5, 6], [7, 8, 9], [10, 11, 12] ];
const ary02 = [ [1, 2, 3], [1, 3, 9], [4, 5, 6], [7, 8, 9] ];

// [1, 3, 7], [1, 3, 9], [10, 11, 12]だけ取りてえ!
const output = [...ary01, ...ary02].filter((value) => 
  !ary01.some(ary => ary.every((a, i) => a === value[i])) || 
  !ary02.some(ary => ary.every((a, i) => a === value[i]))
);
console.log(output);
// [[1, 3, 7], [10, 11, 12], [1, 3, 9]]
[1,2,3] === [1,2,3]
// false
// js 配列 比較 で検索してね!   

JSON.stringify([1,2,3])
// "[1,2,3]"

String([1,2,3])
// "1,2,3"

  const ary01 = [ [1, 2, 3], [1, 3, 7], [4, 5, 6], [7, 8, 9], [10, 11, 12] ];
  const ary02 = [ [1, 2, 3], [1, 3, 9], [4, 5, 6], [7, 8, 9] ];

  // [1, 3, 7], [1, 3, 9], [10, 11, 12]だけ取りてえ!
  const output = [...ary01, ...ary02].filter((value) => 
    !ary01.some(ar => JSON.stringify(ar) === JSON.stringify(value)) || 
    !ary02.some(ar => JSON.stringify(ar) === JSON.stringify(value))
  );
  console.log(output);
  // [[1, 3, 7], [10, 11, 12], [1, 3, 9]]

2つの二次元配列から、重複する配列だけ抽出

※これ書いた当初GASでnew Set()がつかえなかった

const ary01 = [ [1, 2, 3], [1, 3, 7], [4, 5, 6], [7, 8, 9], [10, 11, 12] ];
const ary02 = [ [1, 2, 3], [1, 3, 9], [4, 5, 6], [7, 8, 9] ];

const output = ary01.filter((value) =>  ary02.some(ary => ary.every((a, i) => a === value[i])));
console.log(output);
// [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

図解化している論理学系解説サイトの紹介

矛盾対当とは何か?対当関係における四つの真偽関係の違い①、直接推論に分類される推論の形式②
2. 論理演算 - 易しくない論理学
全称肯定命題 every()
全称否定命題 !every()
特称肯定命題 some()
特称否定命題 !some()

参考URL

javascriptで和集合、積集合、差集合、排他的論理和を取得する際のスニペット
JavaScript:filter()を使って配列内の重複要素を削除・取得したり、2つの配列から共通要素を取得する方法
配列同士で重複する値があるか確認する
2次元配列中の重複削除
クレタ人のパラドックスはパラドックスではない - 神戸大学
[2020CAPE公開セミナー] 論理学上級 I-2「タルスキの真理定義」
多重量化と形式言語

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2