Node-redのJSonata事例3 〜配列の中身が、一つでも文字列に存在するかチェック〜

Node-redのJSonata事例3 〜配列の中身が、一つでも文字列に存在するかチェック〜:

前回記事:

第一弾: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ヶ月したら自分でコード見ても絶対忘れている自身があります。。備忘。。)

ということで、全部見てもらった方は、ありがとうございました。

コメント

このブログの人気の投稿

投稿時間:2021-06-17 22:08:45 RSSフィード2021-06-17 22:00 分まとめ(2089件)

投稿時間:2021-06-20 02:06:12 RSSフィード2021-06-20 02:00 分まとめ(3871件)

投稿時間:2021-06-17 05:05:34 RSSフィード2021-06-17 05:00 分まとめ(1274件)