How to Update Object Nested in Array in React State (Hooks & Classes!) ✨

Omar Shishani
2 min readJan 10, 2021

--

Suppose we have the following state of objects nested within an array:

const [ingredients, setIngredients] = useState([
{item:'banana'},
{item:'avocado'},
{item:'pear'}
]);

In order to edit one of the ingredients without mutating the original state, we need to first make a copy of the original array. We can do this with the spread operator, or .slice():

const newIngredients = [...ingredients];

Or:

const newIngredients = ingredients.slice();

Now, we may be tempted to just run newIngredients[0].item = 'orange', but this would actually mutate the original state. So instead we need to use the following helpful syntax to update the desired ingredient without mutating the original array:

newIngredients[1] = {
...newIngredients[1],
item: 'orange'
};

Now that we’ve updated our newIngredients variable properly, we can use it to set the new state:

setIngredients(newIngredients);

And that’s all folks! Below is shown the similar process with React classes:

state = {
ingredients: [
{item:'banana'},
{item:'avocado'},
{item:'pear'}
]
};
//...
changeIngredients(){
const {ingredients} = this.state;
ingredients[1] = {
...ingredients[1],
item: 'orange'
};
this.setState({ingredients});
};

Try running the following simplified version of the above example in a JavaScript code runner, and you will see that the original state is not mutated:

const ingredients = [
{item:'banana'},
{item:'avocado'},
{item:'pear'}
];
const newIngredients = ingredients.slice();newIngredients[1] = {
...newIngredients[1],
item: 'orange'
};
console.log('ingredients', ingredients);
console.log('newIngredients', newIngredients);
Fruit Salad

Fruit by Jo Sonn on Unsplash
Bird Nest by Jon Sailer on Unsplash

--

--

Omar Shishani
Omar Shishani

Written by Omar Shishani

Hi! I am a React developer who loves technology and learning new things in all different fields. https://omarshishani.com

No responses yet