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()
;它只需要能够查找潜在的父移动。
我有一个 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()
;它只需要能够查找潜在的父移动。