# Split messages arriving out of order

**URL:** <https://discourse.nodered.org/t/split-messages-arriving-out-of-order/71661>\
**Category:** General\
**Created:** [4 December 2022 10:57 UTC](https://discourse.nodered.org/t/split-messages-arriving-out-of-order/71661 "2022-12-04T10:57:03Z")\
**Posts on this page:** 10\
**Page:** 2

<div class="post-metadata">

**Author:** ![TotallyInformation](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/totallyinformation/32/31_2.png) [@TotallyInformation](https://discourse.nodered.org/u/TotallyInformation)\
**Post date:** [4 December 2022 13:59 UTC](https://discourse.nodered.org/t/split-messages-arriving-out-of-order/71661/21 "2022-12-04T13:59:27Z")

</div>

> [@Steve-Mcl](#):
>
> For example, today's challenge would have been super simple with a good "string" node.

Well, I think I could have done it easily in REXX which had super strong string processing. But I still got the right answer for today. Though I did, as usual, have to resort to Google a couple of times. Converting "12-15" to a range array was interesting. Though I think that creating range arrays and then comparing them was probably significant overkill. 🤣

---

<div class="post-metadata">

**Author:** ![cymplecy](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/cymplecy/32/2773_2.png) [@cymplecy](https://discourse.nodered.org/u/cymplecy)\
**Post date:** [4 December 2022 14:00 UTC](https://discourse.nodered.org/t/split-messages-arriving-out-of-order/71661/22 "2022-12-04T14:00:39Z")

</div>

I'm firstly completing them using Snap! and then trying to redo them in NR - I don't know if I'll manage to do Day 3 or not but it keeps me off the streets 🙂

> [@Steve-Mcl](#):
>
> It certainly does highlight areas of improvement for low code nodes.

Yes 🙂

---

<div class="post-metadata">

**Author:** ![TotallyInformation](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/totallyinformation/32/31_2.png) [@TotallyInformation](https://discourse.nodered.org/u/TotallyInformation)\
**Post date:** [4 December 2022 14:01 UTC](https://discourse.nodered.org/t/split-messages-arriving-out-of-order/71661/23 "2022-12-04T14:01:59Z")

</div>

> [@cymplecy](#):
>
> > [@Steve-Mcl](#):
> >
> > It certainly does highlight areas of improvement for low code nodes.
> 
> Yes 🙂

Feels like maybe a new design discussion could be started so that people could feed in ideas?

---

<div class="post-metadata">

**Author:** ![dceejay](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/dceejay/32/38_2.png) [@dceejay](https://discourse.nodered.org/u/dceejay)\
**Post date:** [4 December 2022 22:06 UTC](https://discourse.nodered.org/t/split-messages-arriving-out-of-order/71661/24 "2022-12-04T22:06:27Z")

</div>

Late to the party (busy weekend), but it feels like the batch node ought to help here

---

<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:** [4 December 2022 22:29 UTC](https://discourse.nodered.org/t/split-messages-arriving-out-of-order/71661/25 "2022-12-04T22:29:07Z")

</div>

Any chance of a demo Dave?

I have never used the batch node & struggle to find a use.

---

<div class="post-metadata">

**Author:** ![dceejay](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/dceejay/32/38_2.png) [@dceejay](https://discourse.nodered.org/u/dceejay)\
**Post date:** [5 December 2022 10:35 UTC](https://discourse.nodered.org/t/split-messages-arriving-out-of-order/71661/26 "2022-12-05T10:35:19Z")

</div>

@Steve-Mcl - a simple example like this

```auto
[{"id":"a069df4c2d54915d","type":"inject","z":"273b95be5f0a745f","name":"","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"abcdef","payloadType":"str","x":110,"y":465,"wires":[["1dd4fa914ea28353"]]},{"id":"1dd4fa914ea28353","type":"split","z":"273b95be5f0a745f","name":"","splt":" 1","spltType":"len","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"topic","x":250,"y":465,"wires":[["1dab94cb6dc24d86"]]},{"id":"1dab94cb6dc24d86","type":"change","z":"273b95be5f0a745f","name":"","rules":[{"t":"delete","p":"parts","pt":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":420,"y":465,"wires":[["ca860dff7489fd89"]]},{"id":"ca860dff7489fd89","type":"batch","z":"273b95be5f0a745f","name":"","mode":"count","count":"3","overlap":0,"interval":10,"allowEmptySequence":false,"topics":[],"x":580,"y":465,"wires":[["f6bc94c2c794ee5c"]]},{"id":"f6bc94c2c794ee5c","type":"join","z":"273b95be5f0a745f","name":"","mode":"auto","build":"string","property":"payload","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":false,"timeout":"","count":"","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"","reduceFixup":"","x":725,"y":465,"wires":[["a5d91176e36dbaf2"]]},{"id":"a5d91176e36dbaf2","type":"debug","z":"273b95be5f0a745f","name":"split messages","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":895,"y":465,"wires":[]}]

```

If you actually want two messages with two strings as outputs then remove the change node.

BUT - reading the OP in more detail it seems like the batch size needs to vary - ie to split original string in half - and the batch node doesn't allow the split size to be overridden - so not an exact answer in this instance.

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

---

<div class="post-metadata">

**Author:** ![TotallyInformation](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/totallyinformation/32/31_2.png) [@TotallyInformation](https://discourse.nodered.org/u/TotallyInformation)\
**Post date:** [5 December 2022 16:00 UTC](https://discourse.nodered.org/t/split-messages-arriving-out-of-order/71661/27 "2022-12-05T16:00:26Z")

</div>

Once split, the split's sequence number can be used in a simple switch node to grab the first x entries to one output and the rest to the other. Then a join node on each output does the rest.

---

<div class="post-metadata">

**Author:** ![dceejay](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/dceejay/32/38_2.png) [@dceejay](https://discourse.nodered.org/u/dceejay)\
**Post date:** [5 December 2022 16:59 UTC](https://discourse.nodered.org/t/split-messages-arriving-out-of-order/71661/28 "2022-12-05T16:59:24Z")

</div>

yes true.

```auto
[{"id":"f122b814d6465392","type":"inject","z":"273b95be5f0a745f","name":"","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"abcdefghijklakl","payloadType":"str","x":140,"y":540,"wires":[["fac0c3dbda45b9af"]]},{"id":"fac0c3dbda45b9af","type":"junction","z":"273b95be5f0a745f","x":240,"y":450,"wires":[["cbb3a65ea57ac006","f414bd7c21411950"]]},{"id":"6b677bd092ac5687","type":"inject","z":"273b95be5f0a745f","name":"","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"abcdef","payloadType":"str","x":110,"y":450,"wires":[["fac0c3dbda45b9af"]]},{"id":"06a19c721ea11aac","type":"inject","z":"273b95be5f0a745f","name":"","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"abcdefhghic","payloadType":"str","x":130,"y":495,"wires":[["fac0c3dbda45b9af"]]},{"id":"cbb3a65ea57ac006","type":"split","z":"273b95be5f0a745f","name":"","splt":" 1","spltType":"len","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"topic","x":340,"y":495,"wires":[["c294106f1e604818"]]},{"id":"f414bd7c21411950","type":"change","z":"273b95be5f0a745f","name":"","rules":[{"t":"delete","p":"sec","pt":"flow"}],"action":"","property":"","from":"","to":"","reg":false,"x":370,"y":450,"wires":[[]]},{"id":"c294106f1e604818","type":"function","z":"273b95be5f0a745f","name":"function 7","func":"msg.split = msg.parts.count/2\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":485,"y":495,"wires":[["f5ce9a3af5f04486"]]},{"id":"f5ce9a3af5f04486","type":"switch","z":"273b95be5f0a745f","name":"","property":"parts.index","propertyType":"msg","rules":[{"t":"lt","v":"split","vt":"msg"},{"t":"else"}],"checkall":"true","repair":true,"outputs":2,"x":640,"y":495,"wires":[["20cc830ca7e93daa"],["0fa681706f955292"]]},{"id":"20cc830ca7e93daa","type":"change","z":"273b95be5f0a745f","name":"","rules":[{"t":"set","p":"sec[msg.payload]","pt":"flow","to":"true","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":860,"y":480,"wires":[[]]},{"id":"0fa681706f955292","type":"switch","z":"273b95be5f0a745f","name":"","property":"sec","propertyType":"flow","rules":[{"t":"hask","v":"payload","vt":"msg"}],"checkall":"true","repair":false,"outputs":1,"x":805,"y":525,"wires":[["2dbaeceb7d530ef8"]]},{"id":"2dbaeceb7d530ef8","type":"debug","z":"273b95be5f0a745f","name":"debug 14","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":945,"y":525,"wires":[]}]

```

 ![image](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/3X/9/b/9b2dccbbade742315bcb023622e5d7e9c049cad9.png)

---

<div class="post-metadata">

**Author:** ![TotallyInformation](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/totallyinformation/32/31_2.png) [@TotallyInformation](https://discourse.nodered.org/u/TotallyInformation)\
**Post date:** [5 December 2022 17:24 UTC](https://discourse.nodered.org/t/split-messages-arriving-out-of-order/71661/29 "2022-12-05T17:24:53Z")

</div>

For amusement, here is my over-complex answer to the first part of that challenge:

```auto
const range = (start, stop) => {
    start = Number(start)
    stop = Number(stop)
    return Array.from(
        { length: (stop - start + 1) }, 
        (_, i) => {
            return start + i
        }
    )
}

const out = msg.payload.split(' ')
let trueCount = 0

out.forEach( (pair, i) => {
    let splitPair = pair.split(',')

    splitPair.forEach( (rng, j) => {
        const rngSplit = rng.split('-')
        // Urm, could have just compared the start/end numbers! 😁
        splitPair[j] = range(rngSplit[0], rngSplit[1])
    })
    // out[i] = splitPair

    const trueContains = {
        'pair': pair,
        'All of A in B': splitPair[0].every(r => splitPair[1].includes(r)),
        'All of B in A': splitPair[1].every(r => splitPair[0].includes(r))
    }

    if (trueContains['All of A in B'] || trueContains['All of B in A']) trueCount++

    out[i] = trueContains
})

msg.payload = out
msg.trueCount = trueCount
return msg

```

where the input was a big multi-line input of paired ranges.

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/1X/d073cd938eafa2e558d7c2cd59003b3ef4963033.png) [@system](https://discourse.nodered.org/u/system)\
**Post date:** [19 December 2022 17:24 UTC](https://discourse.nodered.org/t/split-messages-arriving-out-of-order/71661/30 "2022-12-19T17:24:57Z")

</div>

Closed on 19 December 2022 17:24 UTC

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.

[Previous page](https://discourse.nodered.org/t/split-messages-arriving-out-of-order/71661.md?page=1)
