Как удалить вложенный элемент из массива? - PullRequest
0 голосов
/ 06 августа 2020

предполагая интерфейс, такой как:

interface CustomNode {
  id: string;
  children: CustomNode[];
}

Если у меня есть такой объект, как:

nodes: CustomNode[] = [
  {
     id: 'A',
     children: [
       {
         id: 'B',
         children: [
           {
             id: 'C',
             children: [
               {
                 id: 'D',
                 children: []
               },
               {
                 id: 'E',
                 children: []
               }
             ]
           }
         ]
       }
     ]
   }
]

, как я могу создать функцию, которая удаляет данный 'CustomNode' и его дети?

Я предпочитаю решение Typescript / ES6, но меня устраивает любое общее решение (например, Typescript, Javascript, ES, зависимости, такие как loda sh, et c)

например, как я могу удалить CustomNode с идентификатором 'C' и его дочерними элементами?

nodes = removeIfExists(nodes, 'C');
removeIfExists(nodes: CustomNode[], removeId: string) {
 // ...
}

Ответы [ 3 ]

3 голосов
/ 06 августа 2020

Предполагая, что вы не хотите изменять существующий массив или любой из его узлов, а также предполагая, что вы работаете с массивом узлов, а не с одним узлом (похоже, что вы хотите), вы можете написать это вот так:

function removeIfExists(nodes: CustomNode[], removeId: string): CustomNode[] {
    return nodes.
        filter(n => n.id !== removeId).
        map(n => ({ id: n.id, children: removeIfExists(n.children, removeId) }));
}

Мы удаляем все записи с ошибочным идентификатором, а затем рекурсивно сопоставляем оставшиеся узлы. Давайте убедимся, что это работает на вашем примере (который я переименовал в nodes):

const newNodes = removeIfExists(nodes, "C");
console.log(JSON.stringify(newNodes));
//[{ "id": "A", "children": [{ "id": "B", "children": [] }] }]

Мне нравится. Надеюсь, это поможет; удачи!

Детская площадка ссылка на код

0 голосов
/ 06 августа 2020

Если вы хотите создать новый CustomNode[], самый быстрый способ сделать это:

function removeIfExists(nodes: CustomNode[], removeId: string): CustomNode[] {
    let res: CustomNode[] = [];
    for (const node of nodes) {
        if (node.id === removeId) {
            continue;
        }
        res.push({
            id: node.id,
            children: removeIfExists(node.children, removeId),
        })
    }
    return res;
}

Если вы хотите изменить текущий объект, вы можете сделать:

function removeIfExists(nodes: CustomNode[], removeId: string): CustomNode[] {
    let i = 0;
    while (i < nodes.length) {
        if (nodes[i].id === removeId) {
            nodes.splice(i, 1);
            continue;
        }
        removeIfExists(nodes[i].children, removeId);
        ++i;
    }
    return nodes;
}
0 голосов
/ 06 августа 2020

Пример:

var array = [['firstItem','secondItem'],['thirdItem','fourthItem']];
array[0][1] = null;

 array = [['firstItem','secondItem'],['thirdItem','lastItem']];
array[0][1] = null;
document.getElementById('demo').innerHTML = array[0][1]
<html>
<p id="demo"></p>
</html>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...