配列Aには存在していて、配列Bに存在しないものを取り出したい。という事がありました。
ケースとしては すでに記録されているデータがあって(existData)、新たにもらったデータ(newData) のうち、existData にあるものは無視して新しいものだけを取り出したい というものでした。
教えてもらったコードが下記。きっと後でも使うのでメモ。
下記の例では [4,5]
を取り出したい。
javascript/GAS
function pickupNewData(){
const newData = [3,4,5];
const existData = [1,2,3];
const filtered = newData.filter( newVal => {
const hasValue = existData.some( existVal => existVal === newVal );
return !hasValue;
});
console.log(filtered); // => [ 4, 5 ]
}
私、Javascriptで配列を扱う関数(mapとかfilterとかsomeとかreduceとか)を扱うのが苦手なんです。なのでこのコードも、filterの中でsomeがいて、パッとみて「どゆことだ?」って思ってしまうのです。ゆっくり考えたらわかるのにね。
もっといい方法がありそう?
(追記) コメント欄に @xtetsuji さんからアドバイスもらいましたので是非そちらも見てみてください!
ちなみに
return hasValue; // !を取る
にすると「どちらの配列にも存在するもの」である [3]
が取得できます。
追記: 高階関数
その後、filter とか map みたいのを「高階関数」というんだと知りました。高階関数についてはこの動画がめちゃめちゃわかりかすかったので紹介します。英語苦手な私でも字幕付きで理解できました。