<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>RECURSION on DecipherMiddleware</title><link>https://blog.deciphermiddleware.in/tags/recursion/</link><description>Recent content in RECURSION on DecipherMiddleware</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Tue, 13 Jun 2023 17:20:00 +0000</lastBuildDate><atom:link href="https://blog.deciphermiddleware.in/tags/recursion/index.xml" rel="self" type="application/rss+xml"/><item><title>Experimenting Recursion in DataWeave - Fibonacci Series</title><link>https://blog.deciphermiddleware.in/posts/experimenting-recursion-in-dataweave/</link><pubDate>Tue, 13 Jun 2023 17:20:00 +0000</pubDate><guid>https://blog.deciphermiddleware.in/posts/experimenting-recursion-in-dataweave/</guid><description>&lt;p&gt;In various programming languages, &lt;strong&gt;recursion&lt;/strong&gt; is a process in which a method or function calls itself to simplify a complicated problem. Understanding recursive solution sometimes become difficult. Let&amp;rsquo;s try to solve a mathematical problem through recursion with a twist by using &lt;strong&gt;&lt;a href="https://docs.mulesoft.com/dataweave/2.4/"&gt;DataWeave&lt;/a&gt;&lt;/strong&gt;. The Fibonacci series is a generic use case that recursion can solve. This is a very generic question in programming interviews.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEgMCAzoIcrFJGsoVYBmoNgx1holseJ--eU4AlGaAEYcvIeVknXZU_1-9XCSKPhdQ1kys0BPwLs1qXHbSB_9tIZZ8HFd2iYE8uQZlOFmZCePE_n0sZIi4O90K1do27hOCY-U_NvwLPoo-YC57NbivLu3t2n1a3oM1bbAtx73xjOF8to424pDOLZunjLs"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/18b1df67c9.jpg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Photo by &lt;a href="https://unsplash.com/ko/@naletu?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Natalya Letunova&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/nJ07EiRkMUY?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="what-is-fibonacci-series"&gt;What is Fibonacci Series? &lt;a href="#what-is-fibonacci-series" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;A Fibonacci series is a set of integers starting with 0 followed by 1, and a series continuing with the sum of the preceding two integers in the sequence. For example,&lt;/p&gt;
&lt;p&gt;$$
F_n = 0,1,1,2,3,5,8,13,21,34&amp;hellip;
$$&lt;/p&gt;
&lt;h3 id="mathematically"&gt;Mathematically, &lt;a href="#mathematically" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;$$
\begin{align*}
&amp;amp; F_0 = 0 \\
&amp;amp; F_1 = 1 \\
&amp;amp; F_n = F_{(n-1)} + F_{(n-2)}
\end{align*}
$$&lt;/p&gt;
&lt;p&gt;Now transforming the above logic in the form of a recursive function to find the nth digit in the Fibonacci series.&lt;/p&gt;
&lt;h3 id="dataweave-recursive-function"&gt;DataWeave Recursive Function: &lt;a href="#dataweave-recursive-function" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-dw" data-lang="dw"&gt;%dw 2.0
output application/json
fun fib_r(n)=
if (n&amp;lt;=0) 0
else if (n==1) 1
else
fib_r(n-1) + fib_r(n-2)
---
{
recursive:fib_r(9)
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Output&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;recursive&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;34&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/c78f1ed507.gif"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/c78f1ed507.gif" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Testing on dataweave playground and increasing the value of &lt;strong&gt;n&lt;/strong&gt;. The moment we increase the value beyond &lt;strong&gt;27&lt;/strong&gt; , we get an &lt;strong&gt;ERROR&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/94b548fae8.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/94b548fae8.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="error"&gt;ERROR? &lt;a href="#error" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The error shows the execution time taken by dataweave is more than 2.5 seconds. But how do we know how much time is taken by the recursive function? Is there a way to capture the execution time within DataWeave without any custom code/java modules? It&amp;rsquo;s a yes, The DataWeave has a utility module &lt;a href="https://docs.mulesoft.com/dataweave/2.4/dw-timer"&gt;Timer&lt;/a&gt;, which can be used to capture execution time as well as the result of the functions.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-dw" data-lang="dw"&gt;%dw 2.0
import * from dw::util::Timer
output application/json
fun fib_r(n)=
if (n&amp;lt;=0) 0
else if (n==1) 1
else
fib_r(n-1) \+ fib_r(n-2)
---
{
recursive:time(()-&amp;gt;fib_r(27)),
recursive_d:duration(()-&amp;gt;fib_r(27))
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Output&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;recursive&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;start&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2023-06-13T16:33:29.053017Z&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;result&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;610&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;end&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2023-06-13T16:33:29.059367Z&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;recursive_d&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;time&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;result&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;610&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Duration gives us the time taken by function execution in milliseconds and the time function output the start and end timestamp of the execution. With this, the execution time can be measured easily.&lt;/p&gt;
&lt;p&gt;Now, the real issue is if we need to find the &lt;strong&gt;nth&lt;/strong&gt; digit(greater than &lt;strong&gt;27&lt;/strong&gt;) in the Fibonacci series by optimizing space and time. &lt;strong&gt;How can that be done?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/50e6e3c1da.gif"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/50e6e3c1da.gif" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Going back to programming days, there is a way of using &lt;strong&gt;Tail Recursion&lt;/strong&gt;. Now what exactly is tail recursion?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tail recursion&lt;/strong&gt; is using the recursive function as the last statement of the function. The benefit of this approach is it optimises the space as the function doesn&amp;rsquo;t need to keep the track of last 2 execution results. Since the result is populated as part of the last execution statement of the function. Putting the coding hats again for the DataWeave.&lt;/p&gt;
&lt;p&gt;With the new function let&amp;rsquo;s find out the &lt;strong&gt;500 th digit in the Fibonacci series&lt;/strong&gt;.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-dw" data-lang="dw"&gt;%dw 2.0
import * from dw::util::Timer
output application/json
fun fib_r(n)=
if (n&amp;lt;=0) 0
else if (n==1) 1
else
fib_r(n-1) \+ fib_r(n-2)
//tail recursion
fun fib_tr(n, x=0, y=1)=
if(n&amp;lt;=0)
x
else if (n==1)
y
else
fib_tr(n-1,y,x+y)
---
{
recursive:time(()-&amp;gt;fib_r(5)),
tailRecursive:time(()-&amp;gt;fib_tr(500))
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Output&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;recursive&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;start&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2023-06-13T16:48:46.007784Z&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;result&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;end&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2023-06-13T16:48:46.007897Z&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;tailRecursive&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;start&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2023-06-13T16:48:46.007902Z&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;result&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;139423224561697880139724382870407283950070256587697307264108962948325571622863290691557658876222521294125&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;end&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2023-06-13T16:48:46.010339Z&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In nearly 4 milliseconds, the new tail recursive function can give results for the **500 th digit **in the series.&lt;/p&gt;
&lt;h2 id="can-we-improve-the-timings-further"&gt;Can we improve the timings further? &lt;a href="#can-we-improve-the-timings-further" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/86807ebb0c.gif"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/86807ebb0c.gif" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In dataweave, we have a &amp;ldquo;&lt;a href="https://docs.mulesoft.com/dataweave/2.4/dw-core-functions-reduce"&gt;reduce&lt;/a&gt;&amp;rdquo; function, which can be used to get output for the Fibonacci series even faster. Re-writing the logic with the &amp;ldquo;reduce&amp;rdquo; function is kind of challenging. After multiple trials and errors, one way is as below.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-dw" data-lang="dw"&gt;%dw 2.0
import * from dw::util::Timer
output application/json
fun fib_r(n)=
if (n&amp;lt;=0) 0
else if (n==1) 1
else
fib_r(n-1) \+ fib_r(n-2)
//tail recursion
fun fib_tr(n, x=0, y=1)=
if(n&amp;lt;=0)
x
else if (n==1)
y
else
fib_tr(n-1,y,x+y)
//with reduce
fun fib_rr(n)=
if(n&amp;lt;=0)
0
else
if(n==1)
1
else
([2 to n][0] reduce ((i,acc=[0, 1]) -&amp;gt; acc + (acc[i-1] + acc[i-2])))[n]
---
{
recursive:time(()-&amp;gt;fib_r(5)),
tailRecursive:time(()-&amp;gt;fib_tr(500)),
reduce:time(()-&amp;gt;fib_rr(500))
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Output&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;recursive&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;start&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2023-06-13T17:04:41.724469Z&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;result&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;end&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2023-06-13T17:04:41.72455Z&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;tailRecursive&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;start&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2023-06-13T17:04:41.724555Z&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;result&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;139423224561697880139724382870407283950070256587697307264108962948325571622863290691557658876222521294125&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;end&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2023-06-13T17:04:41.726913Z&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;reduce&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;start&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2023-06-13T17:04:41.726923Z&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;result&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;139423224561697880139724382870407283950070256587697307264108962948325571622863290691557658876222521294125&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;end&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2023-06-13T17:04:41.729307Z&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The above DataWeave script is one of the many ways to solve the problem. On comparing all three approaches, the solution using &lt;strong&gt;reduce&lt;/strong&gt; function performs &lt;strong&gt;best of all&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/b8229ff19e.gif"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/b8229ff19e.gif" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Please share your valuable feedback 😊😊😊&lt;/p&gt;</description></item></channel></rss>