LoginSignup
0
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-11-03

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

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

0
1
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
1