I am working with React and ES6. So I arrivied to the following case: I have an state with an array of objects suppose a = [{id: 1, value: 1}, {id: 2, value: 2}] in the state of Object A, then I pass the list to Object B by props, Object B (in the constructor) copy the list to its own state and call a function which is using map function where I return b = [{id: 1, value: 1, text: 'foo'}, {id: 2, value: 2, text: 'foo'}] (added (text, value) to each object), so it though it was not mutating a in Object A but it was.
So I made some tests:
const a = [{id: 1, value: 1}, {id: 2, value: 2}] // suppose it is in object A
addText = (list) => {
return list.map((item) => {item.text = "foo"; return item})
}
const b = addText(a) // suppose it is in object B
so under my assumption a !== b, but a was mutated by addText, so they were equal.
In a large scale project programmers make mistakes (I did here!) how it is supposed to be handled this kind of situations to avoid mutating objects in this way? (The example tries to represet a as an state for Object A which is a component from React)
addText. And imho that's part of the problem. You even write "added (text, value) to each object". That is mutation. Therefore it's hard to understand when you conclude _"so it though it was not mutating".Object Band I supposed it was outside the scope ofObject A, but sure you're right, that's why I said "programmers make mistakes" I did that one, so I wanted to know how to avoid this behavior for other programmers.mapimplies returning a new value. So I don't expect this very mistake to come up often. The only way to definitely prevent the mistake is to make the objects inaimmutable. A more sensible solution would be to pass a copy toaddTextin the first place.