我正在根据以下输入确定给定路由的传递性
[
{
id: 1,
vessel: 'Vessel 1',
routeId: 1,
port: 'HK',
eta: null,
etd: '2016-01-03 00:00:00'
},
{
id: 2,
vessel: 'Vessel 1',
routeId: 1,
port: 'SG',
eta: '2016-01-06 00:00:00',
etd: '2016-01-09 00:00:00'
},
{
id: 3,
vessel: 'Vessel 3',
routeId: 2,
port: 'SG',
eta: '2016-01-12 00:00:00',
etd: '2016-01-14 00:00:00'
},
{
id: 4,
vessel: 'Vessel 3',
routeId: 2,
port: 'OAK',
eta: '2016-01-18 00:00:00',
etd: null
},
{
id: 5,
vessel: 'Vessel 4',
routeId: 3,
port: 'OAK',
eta: '2016-01-21 00:00:00',
etd: '2016-01-23 00:00:00'
},
{
id: 6,
vessel: 'Vessel 4',
routeId: 3,
port: 'LAX',
eta: '2016-01-28 00:00:00',
etd: null
}
];
如果基于routeID键查看各个路由,
路泰德:1,我们有
香港-->新加坡
路泰德:2,我们有
SG-->橡木
路泰德:3,我们有
橡树-->洛杉矶
现在及物性适用于两个不同的routeid,基于以上路径,我们可以说
香港-->橡木,香港-->洛杉矶,新加坡-->洛杉矶
我最初解决这个问题的方法是,首先为单个路由创建一个对象/目标集到源,如下所示
{
1:{
HK: [SG],
SG: []
},
2:{
SG: [US],
US: []
},
3:{
US: [USLA],
USLA: []
}
}
然后我将使用上面的原始输入遍历每个项,并使用创建的集合确定是否存在跨不同routeid的传递性。但我希望得到这个问题的帮助,因为我目前的思考过程似乎没有得到理想的结果。
编辑
预期的产出将是
[
{
vessels: ['Vessel 1', 'Vessle 3'],
routeIds: [1, 2],
origin: 'HK',
destination: 'OAK',
etd: '2016-01-03 00:00:00',
eta: '2016-01-18 00:00:00'
},
{
vessels: ['Vessel 1', 'Vessel 3', 'Vessel 4'],
routeIds: [1, 2, 3],
origin: 'HK',
destination: 'LA',
etd: '2016-01-03 00:00:00',
eta: '2016-01-28 00:00:00'
},
{
vessels: ['Vessel 3', 'Vessel 4'],
routeIds: [2, 3],
origin: 'SG',
destination: 'LA',
etd: '2016-01-14 00:00:00',
eta: '2016-01-28 00:00:00'
}
]
最佳答案
您可以为给定的路由获取一个对象,并使用函数检查id单个路由是否可用。
const
check = (from, to) => routes[from]
? routes[from].some(t => t === to || check(t, to))
: false;
var routes = { HK: ['SG'], SG: ['OAK'], OAK:['LA'] };
console.log([
['HK', 'OAK'], // true
['HK', 'LA'], // true
['SG', 'LA'], // true
['LA', 'OAK'] // false
].map(a => check(...a)));