Angular 9 — Как правильно сравнить скопированный объект на предмет изменений?

#angular #object #copy

#angular #объект #Копировать

Вопрос:

У меня есть вызов API, который возвращает некоторые данные:

 this.myAPI.getProfile().subscribe(result => {
        this.currentProfile = resu<
});
  

Теперь в моем проекте пользователь может редактировать информацию профиля, а для перехода в режим редактирования он нажимает на кнопку.

При входе в режим редактирования я создаю копию текущего объекта профиля, поэтому в случае, если пользователь отменит изменения (с помощью кнопки «Отмена»), я восстановлю исходные данные.

 this.currentProfileCopy = JSON.parse(JSON.stringify(this.currentProfile));
  

Все работает отлично, но у меня проблема, я хочу отключить кнопку «Сохранить», если информация не была изменена, поэтому проверка будет:

 this.currentProfile == this.currentProfileCopy
  

Проблема в том, что эта проверка никогда не возвращает true .
Я думаю, это связано с JSON.stringify .

Я тоже пробовал:

  JSON.parse(JSON.stringify(this.currentProfile)) == this.currentProfileCopy
  

Это также всегда возвращает false ..

Каков правильный способ реализовать это?

ВАЖНО: я не могу использовать Lodash, только методы Angular, поскольку я использую фреймворк, который создает код Angular, не могу импортировать внешние библиотеки. Я также не могу использовать такие вещи, как valueChanges и так далее, мне нужно сделать это, сравнив исходный объект и его копию.

Ответ №1:

Нет решения 1 для сравнения объектов. Все зависит от вашего объекта и от того, какие (типы) данных он содержит.

Основываясь на вашей ограниченной информации, я могу только предложить сравнить его на основе строки JSON, так что что-то вроде этого: JSON.stringify(this.currentProfile) === JSON.stringify(this.currentProfileCopy)

Комментарии:

1. объект содержит стандартные строки и целые числа (имя, фамилия, идентификатор пользователя). В любом случае это работает… Я перепробовал все комбинации, но не эту, поскольку предполагал, что скопированный объект уже был «stringified», поскольку я использовал этот метод для его копирования в первую очередь… хорошо, спасибо

Ответ №2:

Вы можете просто использовать JSON.stringify метод для обеих сторон этого сравнения.

 JSON.stringify(this.currentProfile) === JSON.stringify(this.currentProfileCopy)
  

Ответ №3:

Вы можете использовать lodash библиотеку. Для сравнения двух объектов вы можете использовать isEqual функцию.

https://lodash.com/docs/#isEqual