Update one of the objects in array, in an immutable way Update one of the objects in array, in an immutable way reactjs reactjs

Update one of the objects in array, in an immutable way


You can use map to iterate the data and check for the fieldName, if fieldName is cityId then you need to change the value and return a new object otherwise just return the same object.

Write it like this:

var data = [    {fieldName: 'title', valid: false},     {fieldName: 'description', valid: true},    {fieldName: 'cityId', valid: false},    {fieldName: 'hostDescription', valid: false},]var newData = data.map(el => {                  if(el.fieldName == 'cityId')                     return Object.assign({}, el, {valid:true})                  return el              });this.setState({ data: newData }); 


Here is a sample example - ES6

The left is the code, and the right is the output

enter image description here

Here is the code below

const data = [    { fieldName: 'title', valid: false },     { fieldName: 'description', valid: true },    { fieldName: 'cityId', valid: false }, // old data    { fieldName: 'hostDescription', valid: false },]const newData = data.map(obj => {  if(obj.fieldName === 'cityId') // check if fieldName equals to cityId     return {       ...obj,       valid: true,       description: 'You can also add more values here' // Example of data extra fields     }  return obj});const result = { data: newData }; console.log(result);this.setState({ data: newData });

Hope this helps,Happy Coding!


How about immutability-helper? Works very well. You're looking for the $merge command I think.

@FellowStranger: I have one (and only one) section of my redux state that is an array of objects. I use the index in the reducer to update the correct entry:

case EMIT_DATA_TYPE_SELECT_CHANGE:  return state.map( (sigmap, index) => {    if ( index !== action.payload.index ) {      return sigmap;    } else {      return update(sigmap, {$merge: {        data_type: action.payload.value      }})    }})

Frankly, this is kind of greasy, and I intend to change that part of my state object, but it does work... It doesn't sound like you're using redux but the tactic should be similar.