Javascript中的传递性减少

时间:2018-09-19 16:02:57

标签: javascript algorithm graph-algorithm

我正在根据以下输入信息确定给定路线的可传递性

[
    {
        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'
      }
]

1 个答案:

答案 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)));