Node.js/Javascript Recursive Map Reduction 移除未改变的子节点

Node.js/Javascript Recursive Map Reduction to remove unchanged children

我有一个 key/value 已更改的路径地图,如下例所示:

{
  '/A' => '/AA',
  '/A/B' => '/AA/B',
  '/A/C' => '/AA/C',
  '/A/D' => '/AA/D'
}

左边是旧路径,右边是新路径

我需要将其减少到仅已更改的路径并过滤掉多余的未更改的子项。例如,如果我将“/A”更改为“/AA”,那么我就不需要子项,除非它们已被更改等。

问题是这些路径可能非常深,我需要以某种方式递归地结束实际发生的变化。

3天没走运,想不通,感谢各位代码大侠的帮助:)

只需迭代它们并删除存在匹配祖先移动的所有内容:

const moves = new Map([
  ['/A', '/AA'],
  ['/A/B', '/AA/B'],
  ['/A/C', '/AA/C'],
  ['/A/D', '/AA/X'],
]);

for (const [from, to] of moves) {
  const fromParts = from.split('/');
  for (let i=1; i<fromParts.length; i++) {
    const parentFrom = fromParts.slice(0, i).join('/');
    const parentTo = moves.get(parentFrom);
    if (parentTo !== undefined) {
      const sub = '/' + fromParts.slice(i).join('/');
      if (parentTo + sub === to) {
        console.log(`Move ${from}=>${to} contained in move ${parentFrom}=>${parentTo}`);
        moves.delete(from);
      } else {
        console.log(`Source ${from} is part of ${parentFrom}, but ${sub} was moved to ${to} instead of ${parentTo + sub}`);
      }
    }
  }
}
console.log(Object.fromEntries(moves));

如果您不喜欢改变输入的 moves 地图,您也可以只对一系列移动使用 filter();它只需要能够查找潜在的父移动。