前回記事:
第一弾:https://qiita.com/kouichirou/items/5622dcb14ab22441fe27
第二弾:https://qiita.com/kouichirou/items/d58a251eef3e50658f37
#第三弾です
今回やりたいのは
・とある配列の値を一つ一つ取り出して、別の変数(string)の中にマッチするかを調べる
・一個でも存在する(= true)ならば、全体としてtrueを返す。デフォルトはfalse
です。
これ、意外と簡単に出来そうな気もするんですが、~~実はArrayに対して中身を取り出して、何らかの処理を行う関数が用意されていないんです。~~というかまぁ、Mapがあるんですが、Arrayで使えるeachが欲しかったな、、と。。
$reduce(
$map(
$._somearray
,
function($v) {
$contains($string($._somestring), $v)
}
)
,
function($i,$j){$i or $j}
,
false
)
今回は、map、reduceとcontainsを使ってます。
まずはmapで一つ一つ中身を取り出して、それぞれをcontainsして存在有無をチェックします。
このままだと、結果はBooleanの配列(個数は元の配列と同じ)で出てくるので、1個でもtrueがあれば良しとしたい場合はその集約するfunctionノードを作るのがめんどくさいです。
なので、reduceでそれぞれの配列のbooleanをorで積み上げていくことでtrueが1つでもあれば全体としてtrueのみとなり、そうでなければfalseとなるようになっています。
#本家のガイド
mapとreduce https://docs.jsonata.org/higher-order-functions.html#maparray-function
contains https://docs.jsonata.org/higher-order-functions.html#maparray-function
#まとめ
第一回〜第三回までで、
・ある条件に基づき、二つのリストからデータを抽出し(しかも条件次第で検索の内容も異なる)、それぞれ別の配列およびテキストを取得
・その配列の一つ一つがテキスト列に含まれているかを確認
・一つでも含まれている場合はtrueを返す
というそこそこな処理をChangeノード一つで実装出来ました。
こういうデータ処理はJsonataだと短く記述できて良いですね。
(というか、これ3ヶ月したら自分でコード見ても絶対忘れている自身があります。。備忘。。)
ということで、全部見てもらった方は、ありがとうございました。