Удалить объект из вложенного массива объектов - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть эта маленькая функция (в моем приложении Angular 7), которая использует JavaScript reduce() и находит объект во вложенном массиве объектов.Затем я могу приступить к обновлению некоторых свойств на лету.

Теперь, в дополнение к этой логике поиска, я хотел бы также insert/delete объект в / из вложенного массива.

Вопрос: как только я найду свой объект, могу ли я нажать () и / или удалить объект?

const input={UID:2,GUID:"",LocationName:"USA",ParentLocation:null,subs:[{UID:42,GUID:"",LocationName:"New Jersey",Description:"",subs:[{UID:3,GUID:"",LocationName:"Essex County",ParentLocation:null,"subs":[{UID:4,LocationName:"Newark",ParentLocation:3,"subs":[{"UID":49,"GUID":"","LocationName":"Doctor Smith's Office","LocationType":{"UID":2,"LocationTypeName":"Practice","Description":"other location"},"subs":[{"HostID":38,"HostName":"Ocean Host",}]}]}]}]}]};

const findUIDObj = (uid, parent) => {
  const { UID, subs } = parent;
  if (UID === uid) {
    const { subs, ...rest } = parent;
    return rest;
  }
  if (subs) return subs.reduce((found, child) => found || findUIDObj(uid, child), null);
};
console.log(findUIDObj(49, input));

var obj = findUIDObj(49, input);
delete obj; 

Например, в моем приложении Angular 7 он жалуется, если я пытаюсь delete найденный объект:

ex /

var obj = findUIDObj(49, input);
delete obj; 

  'delete' cannot be called on an identifier in strict mode.

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Кратко рассмотрев ваш код, я вижу, что вы используете идентификатор const для объявления своего сбора данных.Мы используем const только для статических данных, которые не меняются, и в этом их цель.Итак, в первую очередь, это кажется проблемой.Чтобы проверить это, измените его на let.Теперь, что касается методов управления данными, неизменность заслуживает вашего внимания по многим причинам, но именно Angular будет перерисовывать весь объект независимо от изменения существующего объекта или получения нового объекта.Вы можете найти неизменный JavaScript, чтобы понять больше.Во многих случаях создание неизменного управления данными осуществляется с помощью библиотеки, вы можете сделать это самостоятельно.По сути, создайте функцию с именем copy( data ), или что-то подобное, чтобы передать исходный объект, но вы получите его копию взамен без ссылки на исходный объект.Таким образом, человек случайно не меняет исходный объект.Для этого вы можете сделать это внутри вашей функции копирования: return JSON.parse(JSON.stringify( data )) ;

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

0 голосов
/ 28 ноября 2018

delete obj никогда не будет делать то, что вы хотите: во-первых, это даже не объект из вашего ввода, так как функция создала новый объект из найденного объекта, исключая subsсобственности, и вернул это.Но что более важно, delete используется для удаления свойств, а не объектов.

Кажется, вы хотите удалить соответствующий объект из его родительского свойства subs.Для этого вам необходимо изменить массив subs, чтобы исключить соответствующий объект.Для того, чтобы это работало в общем виде, ваши входные данные должны быть массивом.В противном случае этот корневой объект не может быть удален из чего-либо.

Имея это в виду, ваша поисковая функция должна возвращать массив, в котором найдено совпадение и по какому индексу.С этими частями информации вы можете решить удалить этот элемент из массива или вставить другой объект с этим индексом.

Вот как это может работать с удалением:

const input=[{UID:2,GUID:"",LocationName:"USA",ParentLocation:null,subs:[{UID:42,GUID:"",LocationName:"New Jersey",Description:"",subs:[{UID:3,GUID:"",LocationName:"Essex County",ParentLocation:null,"subs":[{UID:4,LocationName:"Newark",ParentLocation:3,"subs":[{"UID":49,"GUID":"","LocationName":"Doctor Smith's Office","LocationType":{"UID":2,"LocationTypeName":"Practice","Description":"other location"},"subs":[{"HostID":38,"HostName":"Ocean Host",}]}]}]}]}]}];

const findUIDObj = (uid, arr) => {
    if (!arr) return;
    const idx = arr.findIndex(obj => obj.UID === uid);
    if (idx > -1) return [arr, idx];
    for (const obj of arr) {
        const result = findUIDObj(uid, obj.subs);
        if (result) return result;
    }
};
console.log(findUIDObj(49, input));

const [arr, idx] = findUIDObj(49, input) || [];
if (arr) {
    arr.splice(idx, 1); // Remove object from its parent array
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...