Javascript 在JS对象图中查找节点之间的路径

Javascript 在JS对象图中查找节点之间的路径,javascript,javascript-objects,graph-theory,Javascript,Javascript Objects,Graph Theory,我如何获得此结果: [ {Paris,Amsterdam,Berlin}, {Paris,Bruxelles,Amsterdam,Berlin}, {Paris,Bruxelles,Berlin} ] 从该阵列: [ { HD: '9:20', V1: 'Paris', V2: 'Amsterdam', D: '3:20' }, { HD: '8:30', V1: 'Paris', V2: 'Bruxelles', D: '1:20' }, { HD: '10:00',

我如何获得此结果:

[
  {Paris,Amsterdam,Berlin},
  {Paris,Bruxelles,Amsterdam,Berlin},
  {Paris,Bruxelles,Berlin}
]
从该阵列:

[
  { HD: '9:20', V1: 'Paris', V2: 'Amsterdam', D: '3:20' },
  { HD: '8:30', V1: 'Paris', V2: 'Bruxelles', D: '1:20' },
  { HD: '10:00', V1: 'Bruxelles', V2: 'Amsterdam', D: '2:10' },
  { HD: '12:30', V1: 'Amsterdam', V2: 'Berlin', D: '6:10' },
  { HD: '11:30', V1: 'Bruxelles', V2: 'Berlin', D: '9:20' } 
]

我想从这个数组中映射数据,以获得从一个城市到另一个城市的所有可能路径,例如从“巴黎”到“柏林”。

无需使用映射功能

在这种情况下,JS似乎与map混淆了

下面是一种使用for语句的方法

var obj=[
{HD:'9:20',V1:'Paris',V2:'Amsterdam',D:'3:20'},
{HD:'8:30',V1:'Paris',V2:'Bruxelles',D:'1:20'},
{HD:'10:00',V1:'Bruxelles',V2:'Amsterdam',D:'2:10'},
{HD:'12:30',V1:'Amsterdam',V2:'Berlin',D:'6:10'},
{HD:'11:30',V1:'Bruxelles',V2:'Berlin',D:'9:20'}
]
控制台日志(obj);
设NewArray=[];
对于(i=0;i而言,输入为a,如下所示:

+-----------------------+
|                       |
|五
巴黎->布鲁塞尔->阿姆斯特丹->柏林
|                       ^
|                       |
+-----------------------+
我们可以构建一个对象,将源字符串映射到它们可能的目的地数组,这比输入对象更方便使用,然后在图形和每个结果路径上运行一个

function*findpath(图形、src、dst、path=[]){
如果(src==dst){
屈服路径concat(dst);
}
else if(图[src]){
路径推送(src);
for(图[src]的常量邻居){
收益率*FindPath(图形、邻居、dst、路径、访问);
}
path.pop(src);
}
};
const graphify=路由=>{
常量图={};
for(路由的常量节点){
if(!graph[node.V1]){
图[node.V1]=[];
}
图[node.V1]。推送(node.V2)
}
返回图;
};
常数路由=[
{HD:'9:20',V1:'Paris',V2:'Amsterdam',D:'3:20'},
{HD:'8:30',V1:'Paris',V2:'Bruxelles',D:'1:20'},
{HD:'10:00',V1:'Bruxelles',V2:'Amsterdam',D:'2:10'},
{HD:'12:30',V1:'Amsterdam',V2:'Berlin',D:'6:10'},
{HD:'11:30',V1:'Bruxelles',V2:'Berlin',D:'9:20'}
];
console.log(…findPaths(graphify(路线),“巴黎”,“柏林”);
我已将路径生成为字符串,如果需要,可以拆分它们并将它们推入数组

如果您需要为任何其他入口点生成路径,您可以这样做。只需更改通过routeGenerator的参数。例如,如果您将其更改为

routeGenerator(“阿姆斯特丹”、“柏林”、“阿姆斯特丹”);

您将获得:

{ 
    duration: 5.4,
    path: 'Amsterdam,Berlin'
}

您不能。每个对象都由一个键和一个值组成。您只有一个键。还有其他解决方案吗?我可以更改数组格式,或者如何在node js中获得此解决方案!感谢您的响应我认为问题在于所需结果中的
{}
对象语法有误。您的意思是
[]
(数组)?代码片段实际上没有显示请求的格式哦,在回答之前我没有看到第二部分。非常感谢您的回答,它对我很有效!但我不明白:为什么调用函数时需要传递参数相同的值,而不是:routeGenerator(“巴黎”、“柏林”);第一个参数是起始位置,第二个参数是保留前一条路径。因此,当我们从一个地方到另一个地方时,它会将路径与前一个连接起来以构建路径。在某一点上,将没有路径前进,然后它会将生成的路径推送到generatedRoutes列表。好的,谢谢,可以d结果中的路径持续时间?因为我需要发送每条路径的信息!我必须计算每条路径的持续时间,最后给出最短路径的持续时间和到达时间我想你要寻找的是从起点到终点的最短路径,对吗它工作得很好,非常感谢你的帮助和花时间回答我
let data = [
    {HD: '9:20', V1: 'Paris', V2: 'Amsterdam', D: '3:20'},
    {HD: '8:30', V1: 'Paris', V2: 'Bruxelles', D: '1:20'},
    {HD: '10:00', V1: 'Bruxelles', V2: 'Amsterdam', D: '2:10'},
    {HD: '12:30', V1: 'Amsterdam', V2: 'Berlin', D: '6:10'},
    {HD: '11:30', V1: 'Bruxelles', V2: 'Berlin', D: '9:20'}
];

function getDuration(hd, d) {
    let time1 = hd.split(":");
    let time2 = d.split(":");
    let h1 = parseInt(time1[0]);
    let m1 = parseInt(time1[1]);
    let h2 = parseInt(time2[0]);
    let m2 = parseInt(time2[1]);
    if (h2 < h1) {
        h2 += 12;
    }
    let time = (h2 * 60 + m2) - (h1 * 60 + m1);
    let offset = (time % 60) * 0.01;
    return Math.floor(time / 60) + offset;
}

let mapper = {};
let durations = {};

data.forEach(item => {
    if (!mapper[item.V1]) {
        mapper[item.V1] = [];
    }
    mapper[item.V1].push(item.V2);
    durations[item.V1 + "_" + item.V2] = getDuration(item.HD, item.D);
});

let generatedRoutes = [];

function routeGenerator(starting, destination, path) {
    if (starting === destination) {
        generatedRoutes.push(path);
        return;
    }
    if (!mapper[starting]) return;
    let routes = mapper[starting];
    routes.forEach(route => {
        routeGenerator(route, destination, path + "," + route);
    })
}

routeGenerator("Paris", "Berlin", "Paris");

function calculateTimeDuration() {
    let minDuration = 100000;
    let minDurationPath = "";
    generatedRoutes.forEach(path => {
        let paths = path.split(",");
        let d = 0;
        for (let i = 0; i < paths.length - 1; i++) {
            let firstCity = paths[i];
            let secondCity = paths[i + 1];
            let key = firstCity + '_' + secondCity;
            d += durations[key];
        }
        if (d < minDuration) {
            minDuration = d;
            minDurationPath = path;
        }
    });
    return {
        duration: minDuration,
        path: minDurationPath
    }
}

console.log(calculateTimeDuration());
{ 
    duration: 11.4,
    path: 'Paris,Amsterdam,Berlin'
}
{ 
    duration: 5.4,
    path: 'Amsterdam,Berlin'
}