Tengo un mapa clave/valor de rutas que han cambiado que se parece a este ejemplo:
{ '/A' => '/AA', '/A/B' => '/AA/B', '/A/C' => '/AA/C', '/A/D' => '/AA/D' }El valor de la izquierda es la ruta anterior, el valor de la derecha es la ruta nueva.
Necesito reducir esto a solo las rutas que han cambiado y filtrar los niños redundantes que no han cambiado. Por ejemplo, si cambio '/A' a '/AA' entonces no necesito los niños, a menos que hayan sido cambiados, etc.
El problema es que estos caminos pueden ser bastante profundos y necesito terminar recursivamente de alguna manera con lo que realmente ha cambiado.
3 días sin suerte, no puedo entenderlo, gracias a los poderosos guerreros del código por cualquier ayuda :)
Simplemente itérelos y elimine todo para lo que exista un movimiento de ancestro coincidente:
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)); Si no le gusta mutar el mapa de moves de entrada, también puede usar filter() en una serie de movimientos; solo necesita poder buscar posibles movimientos de los padres.