Я создал схему json, которая представляет карту острова и связь между ними в этом формате:
MAP:{ sky: [ 'valley' ],
valley: [ 'koopa' ],
mushroom: [ 'toad' ],
toad: [ 'koopa' ],
koopa: [],
twin: [ 'valley' ],
forest: [ 'twin' ] }
и у меня есть позиция A и пункт назначения B; зная, что путь всегда существует на карте, мне нужно создать функцию, которая ищет путь от A до B на карте?
Мой код:
Graph.prototype.getHimHome = function (position, destination, n){
const arr = this.adjList;
let isHome = false;
let path = [destination];
while( !isHome && n>0) {
for( el in arr) { // looping through the json schemma
arr[el].forEach( element => {
if (element === path[path.length - 1])//this means we're on the path;
{
path.push(el);
} else {
path.push(el);
}
})
} ;
if (path[path.length - 1] === position){
isHome = true;
}
n--;
}
console.info(path);
}
Ваша схема кажется мне немного странной; существует только одно место назначения для данного ключа, но оно находится в массиве, что подразумевает, что может быть более одного места назначения. Это точно? Если для каждого ключа есть только одно место назначения, почему вы используете массивы? В его нынешнем виде здесь нет реального алгоритма графа и нет выбора маршрута, это просто вопрос ввода в массив в цикле, пока вы не достигнете пункта назначения (или нет). Пожалуйста, поясните и предоставьте рабочий mcve, чтобы получить точный ответ.
Также в качестве подсказки я бы сначала создал древовидную структуру из данных JSON, где каждый узел хранит имя местоположения и список ссылок на узлы, которые могут его достичь. Затем начните с конечного узла (B) и следуйте по ссылкам назад, пока не достигнете начальной точки (A) (или нет, если пути нет).
Приведенная выше схема Json представляет собой древовидный результат, если вы внимательно ей следуете. Проблема в том, что я не смог создать код, который будет переходить от A к B.: /
К @ggorlen Koopa можно добраться из Долины и Жабы, поэтому его структура представляет собой перевернутое дерево.
Я предлагаю построить перевернутое дерево, а затем работать в обратном направлении от B к A, чтобы легко найти маршрут. Вы можете построить дерево и оставить его для использования снова и снова, вместо того, чтобы строить его каждый раз, когда вам нужен маршрут.
@bcperth В таком случае почему родители находятся в массиве? У каждого узла дерева может быть только один родитель, поэтому либо 1) нет причин для массива, либо 2) опубликованная структура является неполной. В любом случае, перед отправкой ответа стоит уточнить намерение OP.
Чтобы уточнить: схема выше представляет "Узел": [Список смежных]
Я согласен, что массив не является правильной отправной точкой (если, например, он не получил массив от третьей стороны). Правильная структура для этого типа проблемы - дерево, как, я думаю, указывает ggorlen. Было бы неправильно, если бы говорилось, что Таод и Вэлли связаны, и в этом случае необходима более широкая сетевая структура. Можете ли вы подтвердить то, что вы думаете о lcad?
приведенный выше пример пытается распечатать путь от twin ==> koopa.
таким образом печатая близнеца долины Купа.
что такое "н"? вы можете показать, как вы вызываете метод?
@ShaharA n - количество запросов.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Было бы полезно, если бы вы сказали, в чем проблема с предоставленной вами функцией. Что он делает или не делает, как вы ожидали? Вы пробовали использовать отладчик и пошагово выполнять код?