const cities = [ { _id: "A01", name: "London", ancestors: [], children: ["A02", "A27"], parent: null }, { _id: "A02", name: "Venezia", ancestors: ["A01"], children: ["A03", "A15"], parent: "A01" }, { _id: "A03", name: "Barcelona", ancestors: ["A01", "A02"], children: ["A04", "A07"], parent: "A02" }, { _id: "A04", name: "Atina", ancestors: ["A01", "A02", "A03"], children: [], parent: "A03" }, { _id: "A07", name: "Lisabon", ancestors: ["A01", "A02", "A03"], children: [], parent: "A03" }, { _id: "A15", name: "New York", ancestors: ["A01", "A02"], children: ["A16", "A17"], parent: "A02" }, { _id: "A16", name: "Pariz", ancestors: ["A01", "A02", "A15"], children: [], parent: "A15" }, { _id: "A17", name: "Madrid", ancestors: ["A01", "A02", "A15"], children: [], parent: "A15" }, { _id: "A27", name: "Rim", ancestors: ["A01"], children: [], parent: "A01" } ]; const stud = "A03"; //make array which contains elemnet with this id and his ancestors then show names as elements (list-items) in HTML const nbg = "A02"; // make array which contains element with this id and descendants (direct and indirect) then show names as elements (list-items) in HTMLEn la página HTML tengo 2 div
<div id="nbg"></div> <div id="stud"></div>Esta es la lista de soluciones: resultado de salida del elemento:
London Rim Venezia New York Barcelona Atina Pariz Lisabon MardidPuede tener dos funciones recursivas para cada tarea (encontrar antepasados y encontrar descendientes).
Prueba como a continuación.
const cities = [ { _id: "A01", name: "London", ancestors: [], children: ["A02", "A27"], parent: null, }, { _id: "A02", name: "Venezia", ancestors: ["A01"], children: ["A03", "A15"], parent: "A01", }, { _id: "A03", name: "Barcelona", ancestors: ["A01", "A02"], children: ["A04", "A07"], parent: "A02", }, { _id: "A04", name: "Atina", ancestors: ["A01", "A02", "A03"], children: [], parent: "A03", }, { _id: "A07", name: "Lisabon", ancestors: ["A01", "A02", "A03"], children: [], parent: "A03", }, { _id: "A15", name: "New York", ancestors: ["A01", "A02"], children: ["A16", "A17"], parent: "A02", }, { _id: "A16", name: "Pariz", ancestors: ["A01", "A02", "A15"], children: [], parent: "A15", }, { _id: "A17", name: "Madrid", ancestors: ["A01", "A02", "A15"], children: [], parent: "A15", }, { _id: "A27", name: "Rim", ancestors: ["A01"], children: [], parent: "A01" }, ]; const stud = "A03"; //make array which contains elemnet with this id and his ancestors then show names as elements (list-items) in HTML const nbg = "A02"; // make array which contains element with this id and descendants (direct and indirect) then show names as elements (list-items) in HTML const findCity = (cities, id) => { return cities.find((city) => city._id === id); }; // find ancestor city names starting from node with id const findAncestors = (cities, id) => { let cityNames = new Set(); const city = findCity(cities, id); city.ancestors.forEach((cityId) => { const ancestorCity = findCity(cities, cityId); cityNames.add(ancestorCity.name); cityNames = new Set([ ...cityNames, ...findAncestors(cities, ancestorCity._id), ]); }); return cityNames; }; // find descendant city names starting from node with id const findDescendants = (cities, id) => { let cityNames = new Set(); const city = findCity(cities, id); city.children.forEach((cityId) => { const descendantCity = findCity(cities, cityId); cityNames.add(descendantCity.name); cityNames = new Set([ ...cityNames, ...findDescendants(cities, descendantCity._id), ]); }); return cityNames; }; console.log("ancestors"); console.log(Array.from(findAncestors(cities, stud))); console.log("descendants"); console.log(Array.from(findDescendants(cities, nbg)));