Estoy intentando fusionar Tree2 en Tree1. El resultado combinado contiene todos los nodos existentes en Tree1 con la adición de los nodos Tree2, ubicados en el nivel correcto en la jerarquía, que no existen en Tree1. Las entradas finales del árbol son más grandes y profundas, pero he tenido problemas con los árboles de ejemplo simples a continuación.
Tree1 = {"name":"A","children":[{"name":"B","children":[{"name":"C","children":[]}]},"name":"B1","children":[{"name":"C1","children":[]}]}]} Tree2 = {"name":"A", "children":[{"name":"B", "children":[{"name":"C2", "children":[]}]}]} merged = {"name":"A","children":[{"name":"B","children":[{"name":"C","children":[]},{"name":"C2","children":[]}]},{"name":"B1","children":[{"name":"C1","children":[]}]}]}Puede fusionarse mirando el nombre de la propiedad del mismo nivel.
Este enfoque devuelve una matriz, porque si tiene diferentes nombres para la raíz, el resultado contiene al menos dos objetos.
const merge = (a, b) => { if (!Array.isArray(a)) a = [a]; if (!Array.isArray(b)) b = [b]; return [...a, ...b].reduce((r, o) => { const item = r.find(({ name }) => o.name === name); if (item) item.children = merge(item.children, o.children); else r.push(o); return r; }, []); }, tree1 = { name: "A", children: [{ name: "B", children: [{ name: "C", children: [] }] }, { name: "B1", children: [{ name: "C1", children: [] }] }] }, tree2 = { name: "A", children: [{ name: "B", children: [{ name: "C2", children: [] }] }] }, result = merge(tree1, tree2); console.log(result); .as-console-wrapper { max-height: 100% !important; top: 0; }Puedes usar la recursividad para fusionar tus árboles:
function merge(...trees){ var m = {}; for (var i of trees){ m[i.name] = [...(i.name in m ? m[i.name] : []), ...i.children]; } return Object.keys(m).map(function(x){return {name:x, children:m[x].length > 1 ? merge(...m[x]) : m[x]}}) }Notamos la similitud de la lista recopilada de niños y los parámetros iniciales de nuestra función, y podemos terminar con una recursividad simple. Aquí plegamos el árbol en un objeto cuyas claves son los name y cuyos valores son los hijos recopilados. Luego llamamos Object .entries children eso y mapeamos los pares clave-valor en name y (a través de una llamada recurrente) propiedades secundarias para cada uno. Eso es todo lo que se necesita
const mergeTrees = (...trees) => Object .entries (trees .reduce ((a, {name, children = []}) => ({ ...a, [name]: (a [name] || []) .concat (children) }), {})) .map (([k, v]) => ({name: k, children : mergeTrees (...v)})) const tree1 = {name: "A", children: [{name: "B", children: [{name: "C", children: []}]}, {name: "B1", children: [{name: "C1", children: []}]}]} const tree2 = {name: "A", children: [{name: "B", children: [{name: "C2", children: []}]}]} console .log (mergeTrees (tree1, tree2)) .as-console-wrapper {max-height: 100% !important; top: 0}Tenga en cuenta que devolvemos un bosque, no un árbol. Si sabe que todos los árboles tendrán la misma raíz, puede extraer el primer elemento del resultado.