создайте сокращенную копию дерева в javascript

#javascript #algorithm

#javascript #алгоритм

Вопрос:

Я пытаюсь создать сокращенную версию дерева ниже, где у меня есть исходные данные / дерево:

 const treeData = [{
  title: '0-0',
  key: '0-0',
  children: [{
    title: '0-0-0',
    key: '0-0-0',
    children: [
      { title: '0-0-0-0', key: '0-0-0-0', children: [] },
      { title: '0-0-0-1', key: '0-0-0-1', children: [] },
      { title: '0-0-0-2', key: '0-0-0-2', children: [] },
    ],
  }, {
    title: '0-0-1',
    key: '0-0-1',
    children: [
      { title: '0-0-1-0', key: '0-0-1-0', children: [] },
      { title: '0-0-1-1', key: '0-0-1-1', children: [] },
      { title: '0-0-1-2', key: '0-0-1-2', children: [] },
    ],
  }, {
    title: '0-0-2',
    key: '0-0-2',
    children: []
  }],
}, {
  title: '0-1',
  key: '0-1',
  children: [
    { title: '0-1-0-0', key: '0-1-0-0', children: [] },
    { title: '0-1-0-1', key: '0-1-0-1', children: [] },
    { title: '0-1-0-2', key: '0-1-0-2', children: [] },
  ],
}, {
  title: '0-2',
  key: '0-2',
  children: []
}];
  

и массив конечных узлов в качестве входных данных.

 const leafNodes = ['0-0-1-2', '0-1-0-1', '0-1-0-2']
  

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

 const pruned [{
  title: '0-0',
  key: '0-0',
  children: [{
    title: '0-0-1',
    key: '0-0-1',
    children: [
      { title: '0-0-1-2',
        key: '0-0-1-2',
        children: []
      }
    ]
  }]
  }, {
  title: '0-1',
  key: '0-1',
  children: [{
    title: '0-1-0-1',
    key: '0-1-0-1',
    children: []
  }, {
    title: '0-1-0-2',
    key: '0-1-0-2',
    children: []
  }]
}]
  

Я думал о создании узла копирования за узлом вместо копирования источника данных, а затем удаления путей, которые невозможно построить на основе массива / списка конечных узлов, поскольку я полагал, что это было бы проще всего использовать в целях удобства обслуживания, но даже тогда я озадачен тем, как координировать процесс, особенно при учете средних узлов, которые уже были добавлены в мое дерево копирования в процессе, как это было бы в случае ‘0-1-0-1’ и ‘0-1-0-2’. В любом случае, я был в тупике некоторое время и развел руками. Код, на который ссылается javascript, но я был бы открыт для ответов на других языках, достаточно похожих на javascript.

Ответ №1:

Вы могли бы создать новый массив / объекты, найдя целевой ключ, и собрать в него все объекты, вернув массивы с необходимыми узлами.

 function getParts(array, leafes) {
    var result = [];
    array.forEach(o => {
        var children;
        if (leafes.includes(o.key)) {
            result.push(o);
            return;
        }
        children = getParts(o.children, leafes);
        if (children.length) {
            result.push(Object.assign({}, o, { children }));                    
        }
    });
    return resu<
}

const
    treeData = [{ title: '0-0', key: '0-0', children: [{ title: '0-0-0', key: '0-0-0', children: [{ title: '0-0-0-0', key: '0-0-0-0', children: [] }, { title: '0-0-0-1', key: '0-0-0-1', children: [] }, { title: '0-0-0-2', key: '0-0-0-2', children: [] }] }, { title: '0-0-1', key: '0-0-1', children: [{ title: '0-0-1-0', key: '0-0-1-0', children: [] }, { title: '0-0-1-1', key: '0-0-1-1', children: [] }, { title: '0-0-1-2', key: '0-0-1-2', children: [] }] }, { title: '0-0-2', key: '0-0-2', children: [] }] }, { title: '0-1', key: '0-1', children: [{ title: '0-1-0-0', key: '0-1-0-0', children: [] }, { title: '0-1-0-1', key: '0-1-0-1', children: [] }, { title: '0-1-0-2', key: '0-1-0-2', children: [] }] }, { title: '0-2', key: '0-2', children: [] }],
    leafNodes = ['0-0-1-2', '0-1-0-1', '0-1-0-2'],
    pruned = getParts(treeData, leafNodes);

console.log(pruned);  
 .as-console-wrapper { max-height: 100% !important; top: 0; }