我正在根据以下输入信息确定给定路线的可传递性
[
{
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 键查看各个路由,
routeID:1,我们有
HK-> SG
routeID:2,我们有
SG->橡木
routeID:3,我们有
橡木->洛杉矶
现在可传递性适用于两个不同的routeID,根据上述路径,我们可以说存在有效的可传递性
HK-> OAK,HK-> LA,SG-> LA
我解决此问题的原始方法是,首先为看起来像这样的单个路线创建目标的对象/目标集
{
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'
}
]
答案 0 :(得分:0)
您可以为给定的路线获取一个对象,并使用函数来检查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)));