我正在根据以下输入确定给定路由的传递性

[
    {
        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)));

10-06 00:28