Да, вы изменяете свое состояние в этом примере. Хотя filter
создает новый массив, на самом деле это только поверхностная копия оригинала. Элементы вашего массива state.items
являются объектами, поэтому, когда вы изменяете один из них в своем новом массиве results
(который содержит указатели на исходное содержимое state.items
), вы изменяете исходный объект. Посмотрите этот ответ немного подробнее о глубоких и мелких копиях: В чем разница между мелкой копией и глубокой копией с массивами JavaScript?
Чтобы исправить это, вы можете:
1. Используйте оператор распространения на result
, а затем перезапишите значение wearsCape
следующим образом:
result = state.items.filter(s => s.name === sHero.name).map(s => {
return {...s, wearsCape: false}
});
Этот метод работает с сериализуемыми и несериализуемыми данными и является рекомендуемым способом обновления значений вложенных состояний.
Или
2. Сделайте глубокую копию state.items
перед фильтрацией:
const results = JSON.parse(JSON.stringify(state.items)).filter(s => {
return s.name === sHero.name;
});
Этот метод немного странный, но хорошо работает для сериализуемых данных в тех случаях, когда значение, которое вы хотите изменить, глубоко вложено, и использование оператора распространения (...
) много раз становилось бы громоздким.