# Will SORT Node sort multiple arrays

**URL:** <https://discourse.nodered.org/t/will-sort-node-sort-multiple-arrays/4612>\
**Category:** General\
**Created:** [6 November 2018 18:25 UTC](https://discourse.nodered.org/t/will-sort-node-sort-multiple-arrays/4612 "2018-11-06T18:25:32Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![jfehl](https://avatars.discourse-cdn.com/v4/letter/j/d2c977/32.png) [@jfehl](https://discourse.nodered.org/u/jfehl)\
**Post date:** [6 November 2018 18:25 UTC](https://discourse.nodered.org/t/will-sort-node-sort-multiple-arrays/4612/1 "2018-11-06T18:25:32Z")

</div>

I am curious if the `SORT` Node would be used for this situation.

If my flow contains a payloads like -  
`//newTagRead = {"payload":{"epc":flow.rfid[i].epc,"time":currentTime, "ip":flow.rfid[i].ip, "strength":flow.rfid[i].nbRSSIdb}};` which may have 1 - 4 arrays, would I be able to set up a `SORT` to only pass the array with the highest value of the nbRSSIdb which will be an integer?

---

<div class="post-metadata">

**Author:** ![shrickus](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/shrickus/32/517_2.png) [@shrickus](https://discourse.nodered.org/u/shrickus)\
**Post date:** [6 November 2018 22:02 UTC](https://discourse.nodered.org/t/will-sort-node-sort-multiple-arrays/4612/2 "2018-11-06T22:02:07Z")

</div>

Sounds like a perfect use for a JSONata expression...

If you can post a sample of the JSON dataset, I'll be glad to take a whack at it.

---

<div class="post-metadata">

**Author:** ![bug00](https://avatars.discourse-cdn.com/v4/letter/b/9de0a6/32.png) [@bug00](https://discourse.nodered.org/u/bug00)\
**Post date:** [8 June 2020 11:27 UTC](https://discourse.nodered.org/t/will-sort-node-sort-multiple-arrays/4612/3 "2020-06-08T11:27:06Z")

</div>

Same problem and indeed JSONata it's a killer !

For people who have this need Check order by ^(...) [https://docs.jsonata.org/path-operators#order-by-](https://docs.jsonata.org/path-operators#order-by-)

like PAYLOAD^(EAN,\>PRICE) for sort on EAN as first ordering key and price (DESC) for suborder

---

<div class="post-metadata">

**Author:** ![Steve-Mcl](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/steve-mcl/32/4826_2.png) [@Steve-Mcl](https://discourse.nodered.org/u/Steve-Mcl)\
**Post date:** [8 June 2020 19:04 UTC](https://discourse.nodered.org/t/will-sort-node-sort-multiple-arrays/4612/4 "2020-06-08T19:04:43Z")

</div>

@bug00

I just can't bring myself to learn JSONata - for several reasons but I thought this looked interesting for sorting arrays - so thought its time to get to grips with it.

I prepared an array of 2616 objects & ran it though a normal function, unsafe function and a change set to JSONata (data generated [here](https://www.json-generator.com/))  
The measurement is done via a home made subflow making use of regular JS `Dates` (so only ms accuracy) but reasonably representative.

### Input data.

[array2616.json](https://discourse.nodered.org/uploads/short-url/raiVHxnZ0BBFtdSUWqfwVuwZwRO.json) (3.4 MB)

### The flow...

 ![image](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/3X/d/0/d0f3ddef7d6957329d3ec9eb1e4f0e06bbebf742.png)

```auto
[{"id":"9a693308.7ebaf","type":"subflow","name":"flow-performance","info":"","category":"","in":[{"x":80,"y":100,"wires":[{"id":"7fc82258.93e36c"}]}],"out":[{"x":440,"y":100,"wires":[{"id":"7fc82258.93e36c","port":0}]}],"env":[{"name":"name","type":"str","value":"measure","ui":{"icon":"font-awesome/fa-tag","label":{"en-US":"Name"},"type":"input","opts":{"types":["str","env"]}}},{"name":"operation","type":"str","value":"start","ui":{"icon":"font-awesome/fa-cog","label":{"en-US":"Operation"},"type":"select","opts":{"opts":[{"l":{"en-US":"start"},"v":"start"},{"l":{"en-US":"stop"},"v":"stop"},{"l":{"en-US":"msg.topic"},"v":"msg.topic"},{"l":{"en-US":"msg.operation"},"v":"msg.operation"},{"l":{"en-US":"msg.payload"},"v":"msg.payload"}]}}}],"color":"#DDAA99"},{"id":"7fc82258.93e36c","type":"function","z":"9a693308.7ebaf","name":"do operation","func":"var name = msg.perfName || env.get(\"name\");\nvar operation = msg.perfOperation || env.get(\"operation\");\nvar measures = global.get(\"flow-performance\") || {};\nvar measure = measures[name] || {};\n\nfunction doOp(measure, op){\n if(operation === \"start\"){\n measure.start = Date.now();//change to process.hrtime\n measure.stop = null;\n measure.durationMs = null;\n } else if(operation === \"stop\") {\n measure.stop = Date.now();//change to process.hrtime\n measure.durationMs = measure.start ? measure.stop - measure.start : null;\n msg._performance = measure;\n }\n}\n\n\nif(operation === \"start\"){\n doOp(measure, operation);\n} else if(operation === \"stop\") {\n doOp(measure, operation);\n} else if(operation === \"msg.topic\") {\n operation = msg.topic;\n doOp(measure, operation);\n} else if(operation === \"msg.operation\") {\n operation = msg.operation;\n doOp(measure, operation);\n} else if(operation === \"msg.payload\") {\n operation = msg.payload;\n doOp(measure, operation);\n} else {\n return msg; \n}\nmeasures[name] = measure;\nglobal.set(\"flow-performance\", measures);\n\nreturn msg;","outputs":1,"noerr":0,"x":250,"y":100,"wires":[[]]},{"id":"e913f458.ab41f8","type":"file in","z":"96dcfc28.b1202","name":"","filename":"c:/temp/array2616.json","format":"utf8","chunk":false,"sendError":false,"encoding":"none","x":320,"y":120,"wires":[["ef36d18c.0dd4c"]]},{"id":"f6cbf90b.0f6458","type":"inject","z":"96dcfc28.b1202","name":"function","topic":"function","payload":"function","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":110,"y":80,"wires":[["e913f458.ab41f8"]]},{"id":"ef36d18c.0dd4c","type":"json","z":"96dcfc28.b1202","name":"","property":"payload","action":"","pretty":false,"x":530,"y":120,"wires":[["f802e9c.a2ed118","8ec2b68f.e41318"]]},{"id":"f802e9c.a2ed118","type":"debug","z":"96dcfc28.b1202","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":730,"y":120,"wires":[]},{"id":"2b711f14.a0103","type":"inject","z":"96dcfc28.b1202","name":"JSONata","topic":"JSONata","payload":"JSONata","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":120,"y":160,"wires":[["e913f458.ab41f8"]]},{"id":"5be084ef.8c50fc","type":"inject","z":"96dcfc28.b1202","name":"unsafe","topic":"unsafe","payload":"unsafe","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":110,"y":120,"wires":[["e913f458.ab41f8"]]},{"id":"8ec2b68f.e41318","type":"switch","z":"96dcfc28.b1202","name":"","property":"topic","propertyType":"msg","rules":[{"t":"eq","v":"function","vt":"str"},{"t":"eq","v":"JSONata","vt":"str"},{"t":"eq","v":"unsafe","vt":"str"}],"checkall":"true","repair":false,"outputs":3,"x":270,"y":240,"wires":[["734f26b3.087368"],["4ecf1ecd.cb896"],["f46cde18.715be"]]},{"id":"734f26b3.087368","type":"subflow:9a693308.7ebaf","z":"96dcfc28.b1202","name":"normalFunction","env":[{"name":"name","value":"normalFunction","type":"str"}],"x":460,"y":200,"wires":[["e5cab1f9.84ec6"]]},{"id":"bc342cd7.9829","type":"subflow:9a693308.7ebaf","z":"96dcfc28.b1202","name":"normalFunction","env":[{"name":"name","value":"normalFunction","type":"str"},{"name":"operation","value":"stop","type":"str"}],"x":840,"y":200,"wires":[["b810b60b.e237c8"]]},{"id":"4ecf1ecd.cb896","type":"subflow:9a693308.7ebaf","z":"96dcfc28.b1202","name":"JSONata","env":[{"name":"name","value":"JSONata","type":"str"}],"x":440,"y":240,"wires":[["73113ba5.b169e4"]]},{"id":"b69158b5.88e9c8","type":"subflow:9a693308.7ebaf","z":"96dcfc28.b1202","name":"JSONata","env":[{"name":"name","value":"JSONata","type":"str"},{"name":"operation","value":"stop","type":"str"}],"x":820,"y":240,"wires":[["d4c990c1.ddb8f"]]},{"id":"f46cde18.715be","type":"subflow:9a693308.7ebaf","z":"96dcfc28.b1202","name":"unsafeFunction","env":[{"name":"name","value":"unsafeFunction","type":"str"}],"x":460,"y":280,"wires":[["4449e71c.3b62c8"]]},{"id":"7fee5e7a.a804c","type":"subflow:9a693308.7ebaf","z":"96dcfc28.b1202","name":"unsafeFunction","env":[{"name":"name","value":"unsafeFunction","type":"str"},{"name":"operation","value":"stop","type":"str"}],"x":840,"y":280,"wires":[["d8872368.e3e0d"]]},{"id":"e5cab1f9.84ec6","type":"function","z":"96dcfc28.b1202","name":"","func":"msg.payload.sort((a,b) => {\n if(a.age < b.age){\n return -1;\n }else if(a.age > b.age){\n return 1;\n }else{\n return 0;\n }\n})\n\nreturn msg;","outputs":1,"noerr":0,"x":630,"y":200,"wires":[["bc342cd7.9829"]]},{"id":"4449e71c.3b62c8","type":"unsafe-function","z":"96dcfc28.b1202","name":"","func":"msg.payload.sort((a,b) => {\n if(a.age < b.age){\n return -1;\n }else if(a.age > b.age){\n return 1;\n }else{\n return 0;\n }\n})\n\nreturn msg;","outputs":1,"noerr":0,"x":630,"y":280,"wires":[["7fee5e7a.a804c"]]},{"id":"73113ba5.b169e4","type":"change","z":"96dcfc28.b1202","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload^(age)","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":660,"y":240,"wires":[["b69158b5.88e9c8"]]},{"id":"b810b60b.e237c8","type":"debug","z":"96dcfc28.b1202","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":1010,"y":200,"wires":[]},{"id":"d4c990c1.ddb8f","type":"debug","z":"96dcfc28.b1202","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":1010,"y":240,"wires":[]},{"id":"d8872368.e3e0d","type":"debug","z":"96dcfc28.b1202","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","x":1010,"y":280,"wires":[]}]

```

### The results...

![image](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/3X/6/e/6ee67b81fb58520dcc05a8aad72c2ed4c96a7b41.png)

### In summary,

- unsafe function won by 1 or 2 ms (average 4ms) most times
- normal function was 2nd (average about 5ms)
- JSONata was always last and never quicker than 3883ms

_I ran this about 10 times._

Guess I'll stick with what I know (unless I did something wrong?)!

---

<div class="post-metadata">

**Author:** ![janvda](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/janvda/32/234_2.png) [@janvda](https://discourse.nodered.org/u/janvda)\
**Post date:** [18 September 2020 13:08 UTC](https://discourse.nodered.org/t/will-sort-node-sort-multiple-arrays/4612/5 "2020-09-18T13:08:01Z")

</div>

Just ran the test again on my intel-nuc using latest node-red version. So the relative differences are still the same.

![image](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/3X/3/4/3488003818cc12304a7726e6e75679f1f2189f5a.png)

Of course this test specifically tests the performance of sorting a big json array (2617 elements - 3.6MB of data).

FYI my node-red version:

```auto
Starting node-red ...
> node-red-docker@1.1.3 start /usr/src/node-red
> node $NODE_OPTIONS node_modules/node-red/red.js $FLOWS "--userDir" "/data"
18 Sep 15:10:33 - [info] 
Welcome to Node-RED
===================
18 Sep 15:10:33 - [info] Node-RED version: v1.1.3
18 Sep 15:10:33 - [info] Node.js version: v12.18.3
18 Sep 15:10:33 - [info] Linux 4.18.0-193.6.3.el8_2.x86_64 x64 LE

```

I have also reported these findings in:

- [https://github.com/jsonata-js/jsonata/issues/237](https://github.com/jsonata-js/jsonata/issues/237)
