How to implement Sort with Microsoft Flow in 3 actions within a loop
/For some reason, Flow (and LogicApps) doesn’t have a built in sort() method.
So after much nudging from Paul Culmsee, I brooded about this and sat down and built one. There’s three actions within a loop, packing quite a lot of tricks, this is how it all works.
Plan
How does it work conceptually?
Build your own Sort in Microsoft Flow
Simplify it to 3 actions within a loop
Extend it to sort objects and beyond.
Defining what we need
Let’s set up some input and outputs - we want to have our initial variable within the variable “initial-array” and we want to have our final sorted result within the variable “sorted-array”
We want to do a simple insertion sort - for the academic - this is an O(n^2) sort. Not the fastest, but simple enough to understand and express with logic expressions.
How does it work conceptually?
For each element in the initial-array, we will loop add it to a final ‘sorted-array’ in a sorted position.
In the first loop, the sorted array would be empty - but as we progress, for each new value we are considering - we would split the sorted-array into two sets of sub-arrays, ones that are smaller than the current value, and ones that are larger than the current value.
Finally, we combine everything back together in a union, set that to be the new “sorted-array” value, and proceed with the next element in the initial-array.
Build your own Sort in Microsoft Flow
So extending our Flow - add a loop over the initial-array.
Within the loop, we want to put the current item into a compose action. (going with the example above, this would be the element ‘4’ )
Add a compose at the end to see the final output of sorted-array.
Cutting sorted-array into lesser half, greater half
We do this in a parallel branch - these two don’t affect each other - add two Filter Array
Left, set the item() of the sorted-array to be <= the current value of the initial-array
Right, set the item() of the sorted-array to be > the current value of the initial-array
Union the arrays together. That is, the left-array, the right array, and in the middle, the current value, but put that inside an array of 1 element with createArray( <current-value> )
Before the apply to each ends, write the union result back into the “sorted-array” that concludes this loop, getting us ready for the next value.
See how it runs:
The result is a sorted-array.
See for example, loop 6, when the value is ‘4’
Clean up and simplify
We can remove some of the blocks to make the sort ‘smaller’
The final result
3 actions within one loop
Sorting complex (JSON) Objects
It is best to build an sort-array like this with numbers to understand how it works, before attempting to tweak it to sort complex object arrays.
Say for example - if we want to sort by the Date of a complex object array (our scenario was an RSS feed) - within the apply to each, we want to isolate the property we want to compare.
Because the current item’s property is used several times - we add the top compose back into the apply to each loop, we can consider the Compose is a kind of temporary variable used to hold the value that we are using to compare with.
We need to compare against the date in the two Filter-Arrays, but we don’t actually use it for the final Union - because we want to union the arrays together, not union the dates together.
And that’s Sort. Complex explanations, but very elegant with 3 actions inside a loop.