Typescript: Object.assign - мелкая или глубокая копия для удаления - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть объект со структурой типа data.edit.lstAnnotation.lstComments с

...
lstAnnotation?: AnnotationInterface;
...
export interface AnnotationInterface {
  lstComments: CommentList;
}
export class CommentList {
  [key: string]: CommentEntity;
}
...

Насколько я понимаю, функция Object.assign() делает мелкую копию. Это означает, что контент не копируется и ссылки сохраняются. У меня есть функция, такая как

Object.keys(this.data.edit.lstAnnotation.lstComments).map((key: string) => {
      const newEntity = {...this.data.edit.lstAnnotation.lstComments[key]};
      delete newEntity.cur; // <<<<----------------- [1]
      if (newEntity.add && newEntity.add.trim().length === 0) {
        delete newEntity.add;  // <<<<-------------- [2]
      }
      return JSON.stringify(newEntity);
    }).join();

, которая делает хорошую строку. Насколько я понимаю, я создаю мелкую копию содержимого, а затем удаляю (delete) свойства. Мой вопрос: почему delete не применяется к исходному списку (data.edit.lstAnnotation.lstComments)?

У меня все еще есть в data.edit.lstAnnotation.lstComments записи с key cur, например, data.edit.lstAnnotation.lstComments['abc'].cur ==> object....

Я вполне доволен текущей ситуацией. Но если я удаляю из скопированного объекта, а оригинал не обновляется, я бы сказал, что это глубокая копия. Итак, где моя ошибка?

1 Ответ

1 голос
/ 25 февраля 2020

Вот пример кода, который демонстрирует проблему ядра:

const array = [1, 2, 3];
const original = {a: array, b: 4};
const copy = {};
Object.assign(copy, original);
delete copy.a;

Что происходит:

  • Создается массив, содержащий 1, 2, 3, и сохраняется array ссылка на него.
  • Объект создается со свойством a, содержащим ссылку на массив, и свойством b, содержащим значение 4, а original содержит ссылку на новый объект. .
  • Объект создан без свойств, и copy содержит ссылку на него.
  • Object.assign делает поверхностную копию объекта, на которую ссылается original, в объект copy относится к. Это мелкая копия, поэтому copy.a теперь является ссылкой на тот же массив, на который original.a является ссылкой; копия массива не создается.
  • Свойство a, принадлежащее объекту, на который ссылается copy, удалено, поэтому объект больше не имеет свойства с именем a. Объект, на который ссылается original, все еще имеет свое собственное свойство с именем a, поскольку это другой объект.

Это может помочь вам понять, пошагово выполняя выполнение, используя отличный Javascript Инструмент Tutor , который наглядно показывает, что происходит с состоянием программы при выполнении каждой строки.

...