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
In HTML page I have 2 div
<div id="nbg"></div>
<div id="stud"></div>
This is solution list – item output resault:
London
Rim
Venezia
New York
Barcelona
Atina
Pariz
Lisabon
Mardid
You can have two recursive functions for each task (finding ancestors and finding descendants).
Try like below.
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)));