Как удалить ссылки на потомков удаленных свойств - PullRequest
0 голосов
/ 24 мая 2019

Когда я удаляю свойство объекта, мне нужно удалить все ссылки на свойства-потомки, разбросанные по моему приложению:

const people = {
    mary: {
        children: [
            john: new ChildClass(),
            paul: new ChildClass(),
            george: new ChildClass()
        ]
    },
    homer: {
        children: [
            bart: new ChildClass(),
            lisa: new ChildClass(),
            maggie: new ChildClass()
        ]
    }
};

const all_children = [];
/* pseudocode:
foreach people(children) {
    foreach children(child) {
        all_children.push(child);
    }
}
*/

all_children.forEach(child => {
    /* does something with mary and homer's children */
});

//////////////////

delete people.mary;

all_children.forEach(child => {
    /* STILL does something with mary and homer's children,
    even though mary has been deleted */
});

Так что мне либо нужен способ удалить все ссылки на свойства-потомки, либо мне нужно указать, что ссылка связана с удаленным родителем, и игнорировать ее в моих вычислениях.

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

Ответы [ 2 ]

2 голосов
/ 24 мая 2019

Если вам действительно не нужно хранить все дочерние элементы в одном массиве по соображениям производительности, более простое решение состоит в удалении массива all_children в пользу функции, которая возвращает массив всех дочерних элементов, например

function getAllChildren () {
  var all_children = [];
  /* pseudocode:
  foreach people(children) {
    foreach children(child) {
        all_children.push(child);
    }
  }
  */
  return all_children;
}

Таким образом, если вы удалите Мэри или Гомер, вызов этой функции автоматически отразит удаление.

0 голосов
/ 24 мая 2019

Если я правильно понимаю вопрос, вы боитесь, что дочерние объекты все еще существуют в памяти после удаления родительского объекта из массива объектов.Это не относится к javascript, потому что язык не реализует истинные классы.И поэтому каждая копия нового ChildClass () передается по значению, а не по ссылке.

Поэтому вам не нужно отслеживать ссылки на дочерние элементы для их очистки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...