Анализ проблем
workers = workers.map(employee =>
employee.occupation == "Iron Man" ? (employee.occupation = "Philantropist", employee) : (employee.occupation, employee)
);
[...] почему сотрудники также видоизменяются?
array.map()
вызывает переданную функцию скаждый элемент из array
и возвращает новый массив, содержащий значения, возвращаемые этой функцией.
Ваша функция просто возвращает результат выражения
element.baz = condition ? foo : bar;
, которое в зависимости отусловие,
- оценивает
foo
или bar
- , присваивает этот результат
baz
и - возвращает этот результат
Далее (expression1, expression2)
оценит оба выражения и вернет expression2
(см. оператор запятой ).
Таким образом, хотя вы возвращаете employee
в обоих случаях, вы изменяетеисходный объект с левым выражением (выражение 1).
Возможное решение
Возможно, вы захотите создать новый объект, используя Object.assign()
array.map((employee) => Object.assign({ }, employee))
вместо использования этого array.concat()
"трюка".Используя это сопоставление, вы создаете не только новый массив, но и новые объекты с их скопированными атрибутами.Хотя это не будет «глубокой копией» вложенных объектов, таких как { foo: { ... } }
- объект, доступный через свойство foo
, все равно будет той же ссылкой, что и оригинал.В таких случаях вы можете захотеть взглянуть на модули глубокого копирования, упомянутые в других ответах.