# Change node to set value for each object in array

**URL:** <https://discourse.nodered.org/t/change-node-to-set-value-for-each-object-in-array/55853>\
**Category:** General\
**Created:** [29 December 2021 16:15 UTC](https://discourse.nodered.org/t/change-node-to-set-value-for-each-object-in-array/55853 "2021-12-29T16:15:51Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![peter\_a](https://avatars.discourse-cdn.com/v4/letter/p/cdc98d/32.png) [@peter\_a](https://discourse.nodered.org/u/peter_a)\
**Post date:** [29 December 2021 16:15 UTC](https://discourse.nodered.org/t/change-node-to-set-value-for-each-object-in-array/55853/1 "2021-12-29T16:15:51Z")

</div>

I have a flow context variable that contains an array of objects. Each object has a a key/value pair with key "on" and a boolean value:

```auto
{"seg": [
        {"id": 0, "on": true},
        {"id": 1, "on": true},
        {"id": 2, "on": true}
    ]}

```

I'm trying to use a Change node to set the "on" value to "false" for every object in the array.

Is it possible to use the Change node to update all values for "on" keys in one go? Maybe with a JSONata expression? Or will I need to create a function with a for loop to do this?

---

<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:** [29 December 2021 16:25 UTC](https://discourse.nodered.org/t/change-node-to-set-value-for-each-object-in-array/55853/2 "2021-12-29T16:25:12Z")

</div>

> [@peter\_a](#):
>
> Is it possible to use the Change node to update all values for "on" keys in one go? Maybe with a JSONata expression? Or will I need to create a function with a for loop to do this?

Either would work

I personally prefer JavaScript (as it is faster, more devs use JS than JSONata & so more support)

function node...

```auto
const seg = flow.get("seg");
seg.forEach(e => { e.on = false });

```

---

<div class="post-metadata">

**Author:** ![peter\_a](https://avatars.discourse-cdn.com/v4/letter/p/cdc98d/32.png) [@peter\_a](https://discourse.nodered.org/u/peter_a)\
**Post date:** [29 December 2021 16:50 UTC](https://discourse.nodered.org/t/change-node-to-set-value-for-each-object-in-array/55853/3 "2021-12-29T16:50:14Z")

</div>

Thanks @Steve-Mcl

Was hoping to incorporate as one element in a longer list of changes in a single change node. Just wanting to keep things tidy. 🙂

My limited JS knowledge had me hoping I could use a wildcard to change all objects simultaneously:

 ![Screenshot 2021-12-29 at 16.38.11](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/3X/1/5/15ab1f8afe0652119190b3330f03344c3eae5208.png)

Failing that, I'd hoped a little JSONata expression could be used. I've found decent documentation on using JSONata as a query language, but little on using it to modify existing flow context variables.

---

<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:** [29 December 2021 16:55 UTC](https://discourse.nodered.org/t/change-node-to-set-value-for-each-object-in-array/55853/4 "2021-12-29T16:55:22Z")

</div>

if you can formulate the correct expression to return your data with all the `on` properties changed to `false` then re-arrange your change node to

- `SET flow.testState.seg`
- `to the value` `J:` `<your expression>`

---

<div class="post-metadata">

**Author:** ![E1cid](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/e1cid/32/77971_2.png) [@E1cid](https://discourse.nodered.org/u/E1cid)\
**Post date:** [29 December 2021 18:04 UTC](https://discourse.nodered.org/t/change-node-to-set-value-for-each-object-in-array/55853/5 "2021-12-29T18:04:45Z")

</div>

Hereis an example

```auto
[{"id":"21e5e450.ab0664","type":"change","z":"c791cbc0.84f648","name":"","rules":[{"t":"set","p":"payload.seg","pt":"msg","to":"$$.payload.seg.$merge([$,{\"on\": false}])","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":450,"y":440,"wires":[["95b09e83.cfbe38"]]},{"id":"4dd7f307.2c34ec","type":"inject","z":"c791cbc0.84f648","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"{\"seg\": [{\"id\": 0, \"on\": true}, {\"id\": 1, \"on\": true}, {\"id\": 2, \"on\": true}]}","payloadType":"json","x":200,"y":440,"wires":[["21e5e450.ab0664"]]},{"id":"95b09e83.cfbe38","type":"debug","z":"c791cbc0.84f648","name":"b","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":670,"y":340,"wires":[]}]

```

---

<div class="post-metadata">

**Author:** ![peter\_a](https://avatars.discourse-cdn.com/v4/letter/p/cdc98d/32.png) [@peter\_a](https://discourse.nodered.org/u/peter_a)\
**Post date:** [29 December 2021 18:09 UTC](https://discourse.nodered.org/t/change-node-to-set-value-for-each-object-in-array/55853/6 "2021-12-29T18:09:12Z")

</div>

Thanks @E1cid

I ended up with:

```auto
$flowContext('testState') ~> | seg | { 'on': false} |

```

Not sure it's as elegant as your suggestion, but so far, it seems to do the trick!

---

<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:** [27 February 2022 18:09 UTC](https://discourse.nodered.org/t/change-node-to-set-value-for-each-object-in-array/55853/7 "2022-02-27T18:09:54Z")

</div>

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