Shiroganari
@Shiroganari
Fullstack Junior Developer

Содержимое массива меняется само по себе?

У меня имеются две переменные.
При запуске приложения я добавляю в них одинаковые данные, но в процессе работы приложения меняю значения у массива departments.
При нажатии на кнопку "Сбросить" все данные в массиве departments должны замениться данными из массива defaultDepartments.
Первый раз всё отработает хорошо, но после этого данные у defaultDepartments начинают меняться одновременно с departments, хотя в коде этого нигде явно даже близко не указано.
То есть массивы ведут себя так, как будто ссылаются на одну и ту же область памяти.
В чём проблема? По какой причине данные в массиве defaultDepartments начинают меняться?
Хотя если явно сделать массив departments пустым, то массив defaultDepartments не изменится.

departments: LocalDepartment[] = [];
defaultDepartments: LocalDepartment[] = [];

ngOnInit(): void {
  this.departments = this.formDepartments(departments, participants);
  this.defaultDepartments = this.formDepartments(departments, participants);
}
  
reset(): void {
   this.departments = [...this.defaultDepartments];
}


Если это важно, то вот структура этих массивов:
interface LocalDepartment {
  id: number;
  name?: string;
  colleagues: LocalColleague[];
  selectedCount: number;
  isAllSelected: boolean;
}

interface LocalColleague {
  id: number;
  firstName: string;
  lastName: string;
  departmentId: number;
  isSelected: boolean;
}
  • Вопрос задан
  • 136 просмотров
Решения вопроса 1
sergiks
@sergiks Куратор тега JavaScript
♬♬
defaultDepts заполнен объектами. Объекты передаются по ссылке в JS.
[...defaultDepts] создаёт новый массив старых объектов. Меняете что-то внутри этих объектов — меняется и внутри defaultDepts.

Нужна «глубокая копия».

Причём не просто
[...this.defaultDepartments].map(item => {...item})
, а нормальная рекурсивная. Ведь ещё и свойство colleagues, с свою очередь, содержит массив объектов.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы