筛选和比较两个项目的列表

Filtering and Comparing List of Two Items

本文关键字:两个 项目 列表 比较 筛选      更新时间:2023-09-26

这是一个Sails.js和Node.js应用程序。我正在努力解决我遇到的一个问题。我不知道该怎么解它。这就是为什么我的问题的标题与它不太相符。

但是,这就是场景。我:

订单列表

{
    "vehicleType": "30tonne",
    "waybill": "7006722988",
    "obdCreationDate": "01/11/16 1:21:50 PM",
    "route": "5817895991a297ccb386469d",
    "source": "agbara",
    "destination": "ilorin",
    "batchNumber": "ebf96f3322320fb2bedb7bf126f87ab8367f5bd6061cde78ab300e464df2c7af"
  },
  {
    "vehicleType": "30tonne",
    "waybill": "7006691063",
    "obdCreationDate": "01/11/16 1:21:50 PM",
    "route": "5817895e91a297ccb38646d9",
    "source": "agbara",
    "destination": "katsina",
    "batchNumber": "ebf96f3322320fb2bedb7bf126f87ab8367f5bd6061cde78ab300e464df2c7af"
  },

我有这个:

转运蛋白列表

    {
        "vehicles": [
          {
            "assetIdentification": "EWEW",
            "vehicleType": "na",
            "transporter": "5817891891a297ccb38645c1",
            "organization": "5817878612a8dce1b2e4d359",
            "status": "available",
            "isDeleted": false,
            "createdAt": "2016-10-31T18:20:32.963Z",
            "updatedAt": "2016-10-31T18:20:32.963Z",
            "id": "5800c3cc391eaa0709cffee5"
          },
          {
            "assetIdentification": "RERE",
            "vehicleType": "na",
            "transporter": "5817891891a297ccb38645c1",
            "organization": "5817878612a8dce1b2e4d359",
            "status": "available",
            "isDeleted": false,
            "createdAt": "2016-10-31T18:20:32.965Z",
            "updatedAt": "2016-10-31T18:20:32.965Z",
            "id": "5800c4d9391eaa0709cffee6"
          }
        ],
        "rates": [
          {
            "fixedCost": 280759,
            "variableCost": 0,
            "vehicleType": "30tonne",
            "organization": "5817878612a8dce1b2e4d359",
            "route": "5817894b91a297ccb38645f9",
            "transporter": "5817891891a297ccb38645c1",
            "tripType": "normal",
            "active": true,
            "isDeleted": false,
            "totalCost": 280759,
            "createdAt": "2016-10-31T18:14:33.668Z",
            "updatedAt": "2016-10-31T18:14:33.668Z",
            "id": "58178a093ee3f7ffb3b14a47",
            "_route": "5817894b91a297ccb38645f9"
          },
          {
            "fixedCost": 280759,
            "variableCost": 0,
            "vehicleType": "30tonne",
            "organization": "5817878612a8dce1b2e4d359",
            "route": "5817894b91a297ccb38645fa",
            "transporter": "5817891891a297ccb38645c1",
            "tripType": "normal",
            "active": true,
            "isDeleted": false,
            "totalCost": 280759,
            "createdAt": "2016-10-31T18:14:33.866Z",
            "updatedAt": "2016-10-31T18:14:33.866Z",
            "id": "58178a093ee3f7ffb3b14a66",
            "_route": "5817894b91a297ccb38645fa"
          }
        ],
        "organization": "5817878612a8dce1b2e4d359",
        "name": "Some Organization",
        "email": "sosoos@soso.so",
        "phone": "8392398293829",
        "active": true,
        "isDeleted": false,
        "slug": "some-orgs",
        "createdAt": "2016-10-31T18:10:32.623Z",
        "updatedAt": "2016-10-31T18:10:32.623Z",
        "id": "5817891891a297ccb38645c1"
      }

上面的记录(Transporters)大于9000,每个Transporters的rates大于200。在此之前的(ORDERS)可以是任意大小。

所以,这就是问题所在。每个阶都有routeIdvehicleType。转运体有Array of vehicles with vehicleSize (s), Array of rates which each have rateId, vehicleType and totalCost(Cost for that route)。我试图解决的问题是获得最便宜的完成所有订单的速率,即使给每个运输商分配一个订单会使它变得便宜。我写了一个循环中的循环来做各种形式的组合它得到了最便宜的。但是,针对30 Orders运行它会使应用程序不可用于任何其他请求,并且使用7GB专用RAM,我们仍然会时不时地耗尽内存,并且由于JavaScript是同步的,这肯定会使应用程序运行的端口无用,除非它完成了该操作。30 Orders需要30分钟到1小时。

我想不出该做什么。我试着通过PermutationCombination是否可以解决它,但没有。我不是在找一个完整的书面解决方案。我只是需要关于做什么和如何去做的建议。任何帮助都将非常感激。谢谢。

这是一个经典的a *寻路任务。为了优化,你应该创建反向索引[vehicleType,route]=>[vehicle],对于每一个vehicleType和route的组合,它需要通过所有速率进行一次迭代,例如O(r)。然后通过每个订单,你可以从索引中分配相关的车辆。它没有考虑到活动和可用标志,同一辆车可能会被分配多个订单,但是用价格订购的结果车辆数组扩展上述索引将很容易改进。

反向索引最好通过map-reduce在数据库端建立。不过您也可以在节点中构建它:

let ratesByRouteVType = []
transporters
  .rates
    .forEach(r => {
       let cmpRate = ratesByRouteVType[r.route+r.vehicleType]
       if(!cmpRate || cmpRate.totalCost>r.totalCost)
         ratesByRouteVType[r.route+r.vehicleType]=r
     })