【问题标题】:get key value from object and add it to another object matching nested value从对象获取键值并将其添加到另一个匹配嵌套值的对象
【发布时间】:2020-06-07 00:27:10
【问题描述】:

我正在使用 angular 和 lodash。 我有两个对象数组。我要做的是从第二个获取vehicle 键值并将其添加到consegne 的每个对象中的一个新键veicolo 中。我的目标是检查route 的steps.location 内部是否有来自consegne 的lat_cliente 和long_cliente,如果是,则从route 获取对应的vehicle 键值并将其添加到consenge,所以最后我可以知道哪个交付分配给什么车辆。

我的数组:

康塞涅:

consegne = {
    "2020-06-03 14:30:00": [
      {
        "max(a.dataora_ord)": "2020-06-03T11:43:12.508Z",
        id_ordine: 100002,
        id_cliente: "2199",
        id_negozio: "1",
        numero_prodotti: 1,
        importo: 11.3,
        indirizzo_cliente: "VIA BENEDETTO CROCE 1 GUBBIO",
        lat_cliente: 43.3422695,
        long_cliente: 12.5914081,
        lat_negozio: 43.1070321,
        long_negozio: 12.402996209906487
      }
    ],
    "2020-06-04 14:30:00": [
      {
        "max(a.dataora_ord)": "2020-06-04T11:52:38.099Z",
        id_ordine: 100003,
        id_cliente: "2197",
        id_negozio: "1",
        numero_prodotti: 3,
        importo: 67.64,
        indirizzo_cliente: "VIA PIAVE 1 SAN GEMINI",
        lat_cliente: 42.6103269,
        long_cliente: 12.5503077,
        lat_negozio: 43.1070321,
        long_negozio: 12.402996209906487
      }
    ],
    "2020-06-01 11:30:00": [
      {
        "max(a.dataora_ord)": "2020-06-01T08:27:28.467Z",
        id_ordine: 100000,
        id_cliente: "2194",
        id_negozio: "1",
        numero_prodotti: 2,
        importo: 8.71,
        indirizzo_cliente: "PIAZZA BRANDUCCI 1 FOLIGNO",
        lat_cliente: 42.95726165,
        long_cliente: 12.70359885,
        lat_negozio: 43.1070321,
        long_negozio: 12.402996209906487
      }
    ],
    "2020-05-27 10:30:00": [
      {
        "max(a.dataora_ord)": "2020-05-27T07:44:00.000Z",
        id_ordine: 99999,
        id_cliente: "2210",
        id_negozio: "1",
        numero_prodotti: 5,
        importo: 41.79,
        indirizzo_cliente: "LOCALITA' ARVELLO 1 FOLIGNO",
        lat_cliente: 43.0324959,
        long_cliente: 12.8516742,
        lat_negozio: 43.1070321,
        long_negozio: 12.402996209906487
      }
    ],
    ...
  };

路线:

  route = [
    {
      vehicle: 1,
      cost: 9438,
      delivery: [1],
      amount: [1],
      pickup: [0],
      service: 420,
      duration: 9438,
      waiting_time: 0,
      distance: 145681,
      steps: [
        {
          type: "job",
          location: [12.5503077, 42.6103269],
          job: 0,
          service: 420,
          waiting_time: 0,
          load: [0],
          arrival: 1590071446,
          duration: 4766,
          distance: 73086
        }
      ],
      geometry:
        ""
    },
    {
      vehicle: 1,
      cost: 9438,
      delivery: [1],
      amount: [1],
      pickup: [0],
      service: 420,
      duration: 9438,
      waiting_time: 0,
      distance: 145681,
      steps: [
        {
          type: "job",
          location: [12.5503077, 42.6103269],
          job: 0,
          service: 420,
          waiting_time: 0,
          load: [0],
          arrival: 1590071446,
          duration: 4766,
          distance: 73086
        }
      ],
      geometry:
        ""
    },
    {
      vehicle: 1,
      cost: 6448,
      delivery: [1],
      amount: [1],
      pickup: [0],
      service: 420,
      duration: 6448,
      waiting_time: 0,
      distance: 81974,
      steps: [
        {
          type: "job",
          location: [12.5914081, 43.3422695],
          job: 0,
          service: 420,
          waiting_time: 0,
          load: [0],
          arrival: 1590069911,
          duration: 3231,
          distance: 40076
        }
      ],
      geometry:
        ""
    },
    {
      vehicle: 1,
      cost: 5066,
      delivery: [1],
      amount: [1],
      pickup: [0],
      service: 420,
      duration: 5066,
      waiting_time: 0,
      distance: 73636,
      steps: [
        {
          type: "job",
          location: [12.70359885, 42.95726165],
          job: 0,
          service: 420,
          waiting_time: 0,
          load: [0],
          arrival: 1590069018,
          duration: 2338,
          distance: 36148
        }
      ],
      geometry:
        ""
    },
    {
      vehicle: 1,
      cost: 8824,
      delivery: [2],
      amount: [2],
      pickup: [0],
      service: 840,
      duration: 8824,
      waiting_time: 0,
      distance: 137129,
      steps: [
        {
          type: "job",
          location: [12.7224235, 42.9327554],
          job: 1,
          service: 420,
          waiting_time: 0,
          load: [1],
          arrival: 1590069262,
          duration: 2582,
          distance: 42641
        },
        {
          type: "job",
          location: [12.3291318, 43.305996],
          job: 0,
          service: 420,
          waiting_time: 0,
          load: [0],
          arrival: 1590073531,
          duration: 6431,
          distance: 102982
        }
      ],
      geometry:
        ""
    },
    {
      vehicle: 1,
      cost: 1562,
      delivery: [1],
      amount: [1],
      pickup: [0],
      service: 420,
      duration: 1562,
      waiting_time: 0,
      distance: 16290,
      steps: [
        {
          type: "job",
          location: [12.4418193, 43.133661],
          job: 4,
          service: 420,
          waiting_time: 0,
          load: [0],
          arrival: 1590067508,
          duration: 828,
          distance: 8181
        }
      ],
      geometry:
        ""
    },
    {
      vehicle: 2,
      cost: 17059,
      delivery: [4],
      amount: [4],
      pickup: [0],
      service: 1680,
      duration: 17059,
      waiting_time: 0,
      distance: 245267,
      steps: [
        {
          type: "job",
          location: [12.5914081, 43.3422695],
          job: 3,
          service: 420,
          waiting_time: 0,
          load: [3],
          arrival: 1590069911,
          duration: 3231,
          distance: 40076
        },
        {
          type: "job",
          location: [12.5407404, 43.1424873],
          job: 1,
          service: 420,
          waiting_time: 0,
          load: [2],
          arrival: 1590072736,
          duration: 5636,
          distance: 74350
        },
        {
          type: "job",
          location: [12.538253, 43.1009005],
          job: 2,
          service: 420,
          waiting_time: 0,
          load: [1],
          arrival: 1590073639,
          duration: 6119,
          distance: 80353
        },
        {
          type: "job",
          location: [12.6476612, 42.5602885],
          job: 0,
          service: 420,
          waiting_time: 0,
          load: [0],
          arrival: 1590079503,
          duration: 11563,
          distance: 161286
        }
      ],
      geometry:
        ""
    },
    {
      vehicle: 1,
      cost: 4730,
      delivery: [1],
      amount: [1],
      pickup: [0],
      service: 420,
      duration: 4730,
      waiting_time: 0,
      distance: 66605,
      steps: [
        {
          type: "job",
          location: [12.3291318, 43.305996],
          job: 0,
          service: 420,
          waiting_time: 0,
          load: [0],
          arrival: 1590069017,
          duration: 2337,
          distance: 32457
        }
      ],
      geometry:
        ""
    },
    {
      vehicle: 1,
      cost: 6150,
      delivery: [1],
      amount: [1],
      pickup: [0],
      service: 420,
      duration: 6150,
      waiting_time: 0,
      distance: 90278,
      steps: [
        {
          type: "job",
          location: [12.7592267, 43.0696255],
          job: 0,
          service: 420,
          waiting_time: 0,
          load: [0],
          arrival: 1590069655,
          duration: 2975,
          distance: 45300
        }
      ],
      geometry:
        ""
    },
    {
      vehicle: 1,
      cost: 2947,
      delivery: [1],
      amount: [1],
      pickup: [0],
      service: 420,
      duration: 2947,
      waiting_time: 0,
      distance: 31642,
      steps: [
        {
          type: "job",
          location: [12.517752, 43.155195],
          job: 0,
          service: 420,
          waiting_time: 0,
          load: [0],
          arrival: 1590068153,
          duration: 1473,
          distance: 15811
        }
      ],
      geometry:
        ""
    },
    {
      vehicle: 1,
      cost: 12378,
      delivery: [4],
      amount: [4],
      pickup: [0],
      service: 1680,
      duration: 12378,
      waiting_time: 0,
      distance: 178809,
      steps: [
        {
          type: "job",
          location: [12.7020796, 42.9564996],
          job: 11,
          service: 420,
          waiting_time: 0,
          load: [3],
          arrival: 1590069028,
          duration: 2348,
          distance: 36221
        },
        {
          type: "job",
          location: [12.7020796, 42.9564996],
          job: 10,
          service: 420,
          waiting_time: 0,
          load: [2],
          arrival: 1590069448,
          duration: 2348,
          distance: 36221
        },
        {
          type: "job",
          location: [12.649205, 42.5624235],
          job: 8,
          service: 420,
          waiting_time: 0,
          load: [1],
          arrival: 1590074020,
          duration: 6500,
          distance: 91183
        },
        {
          type: "job",
          location: [12.5471666, 42.6143734],
          job: 4,
          service: 420,
          waiting_time: 0,
          load: [0],
          arrival: 1590075752,
          duration: 7812,
          distance: 107094
        }
      ],
      geometry:
        ""
    },
    {
      vehicle: 2,
      cost: 8513,
      delivery: [4],
      amount: [4],
      pickup: [0],
      service: 1680,
      duration: 8513,
      waiting_time: 0,
      distance: 117438,
      steps: [
        {
          type: "job",
          location: [12.7037126, 42.9575853],
          job: 0,
          service: 420,
          waiting_time: 0,
          load: [3],
          arrival: 1590069044,
          duration: 2364,
          distance: 36287
        },
        {
          type: "job",
          location: [12.7592267, 43.0696255],
          job: 6,
          service: 420,
          waiting_time: 0,
          load: [2],
          arrival: 1590070831,
          duration: 3731,
          distance: 53447
        },
        {
          type: "job",
          location: [12.7803655, 43.2322369],
          job: 5,
          service: 420,
          waiting_time: 0,
          load: [1],
          arrival: 1590072722,
          duration: 5202,
          distance: 74454
        },
        {
          type: "job",
          location: [12.7860033, 43.2321763],
          job: 1,
          service: 420,
          waiting_time: 0,
          load: [0],
          arrival: 1590073340,
          duration: 5400,
          distance: 75854
        }
      ],
      geometry:
        ""
    },
    {
      vehicle: 3,
      cost: 11843,
      delivery: [4],
      amount: [4],
      pickup: [0],
      service: 1680,
      duration: 11843,
      waiting_time: 0,
      distance: 168496,
      steps: [
        {
          type: "job",
          location: [12.191765, 43.5116042],
          job: 2,
          service: 420,
          waiting_time: 0,
          load: [3],
          arrival: 1590070697,
          duration: 4017,
          distance: 60993
        },
        {
          type: "job",
          location: [12.1659394, 43.5551518],
          job: 9,
          service: 420,
          waiting_time: 0,
          load: [2],
          arrival: 1590071741,
          duration: 4641,
          distance: 67362
        },
        {
          type: "job",
          location: [12.5263973, 43.105579],
          job: 7,
          service: 420,
          waiting_time: 0,
          load: [1],
          arrival: 1590076781,
          duration: 9261,
          distance: 136495
        },
        {
          type: "job",
          location: [12.4302894, 43.0265033],
          job: 3,
          service: 420,
          waiting_time: 0,
          load: [0],
          arrival: 1590078466,
          duration: 10526,
          distance: 152845
        }
      ],
      geometry:
        ""
    }
  ];

在路由数组中

对象数组,我正在尝试使用 lodash 获取对象索引检查其中的嵌套数组值(即使也接受 vanilla js 的解决方案)

这是我尝试过的:

import { Component, VERSION, OnInit } from "@angular/core";
import * as _ from "lodash";

@Component({
  selector: "my-app",
  templateUrl: "./app.component.html",
  styleUrls: ["./app.component.css"]
})
export class AppComponent implements OnInit {
  name = "Angular " + VERSION.major;


  ngOnInit() {
    const coord = [];
    _.forOwn(this.consegne,
      coordinatePoi => _.map(coordinatePoi,
        latLong => coord.push(_.at(latLong, ['long_cliente', 'lat_cliente'])))
    )

    coord.forEach(co => {
      const f = _.filter(this.route,
        {
          steps: [{location: co}]
        }
      );

      if(f[0] && f[0].vehicle) {
        _.forOwn(this.consegne, clienti => {_.forEach(clienti, c => c['veicolo'] = f[0].vehicle); console.log(this.consegne)})
      }
    })
  }
}

这是我的部分成功,但我认为我遗漏了一些东西:

最终的结果是:

consegne = {
    ...

    "2020-05-20 16:30:00": [
      {
        "max(a.dataora_ord)": "2020-05-20T13:59:03.000Z",
        id_ordine: 20,
        id_cliente: "2258",
        id_negozio: "1",
        numero_prodotti: 5,
        importo: 35.19,
        indirizzo_cliente: "CORSO NUOVO 1 FOLIGNO",
        lat_cliente: 42.9575853,
        long_cliente: 12.7037126,
        lat_negozio: 43.1070321,
        long_negozio: 12.402996209906487,
        veicolo: 1 // for example
      },
      {
        "max(a.dataora_ord)": "2020-05-20T13:39:54.000Z",
        id_ordine: 18,
        id_cliente: "2216",
        id_negozio: "1",
        numero_prodotti: 11,
        importo: 76.52,
        indirizzo_cliente: "VIA NUCCI 1 GUALDO TADINO",
        lat_cliente: 43.2321763,
        long_cliente: 12.7860033,
        lat_negozio: 43.1070321,
        long_negozio: 12.402996209906487,
        veicolo: 1 // for example
      },
      {
        "max(a.dataora_ord)": "2020-05-20T13:54:50.000Z",
        id_ordine: 15,
        id_cliente: "2302",
        id_negozio: "1",
        numero_prodotti: 12,
        importo: 103.31,
        indirizzo_cliente: "VIA ANNA GRAZIANI 1 TORGIANO",
        lat_cliente: 43.0265033,
        long_cliente: 12.4302894,
        lat_negozio: 43.1070321,
        long_negozio: 12.402996209906487,
        veicolo: 2 // for example
      },
      {
        "max(a.dataora_ord)": "2020-05-20T13:11:38.000Z",
        id_ordine: 17,
        id_cliente: "2193",
        id_negozio: "1",
        numero_prodotti: 7,
        importo: 64.52,
        indirizzo_cliente: "PIAZZA VITTORIO VENETO - SELCI LAMA 1 SAN GIUSTINO",
        lat_cliente: 43.5116042,
        long_cliente: 12.191765,
        lat_negozio: 43.1070321,
        long_negozio: 12.402996209906487,
        veicolo: 3 // for example
      },
      {
        "max(a.dataora_ord)": "2020-05-20T13:59:10.000Z",
        id_ordine: 13,
        id_cliente: "2271",
        id_negozio: "1",
        numero_prodotti: 15,
        importo: 92.12,
        indirizzo_cliente: "VIA FLAMINIA NORD 1 VALTOPINA",
        lat_cliente: 43.0696255,
        long_cliente: 12.7592267,
        lat_negozio: 43.1070321,
        long_negozio: 12.402996209906487,
        veicolo: 1 // for example
      },
      {
        "max(a.dataora_ord)": "2020-05-20T13:56:03.000Z",
        id_ordine: 12,
        id_cliente: "2224",
        id_negozio: "1",
        numero_prodotti: 18,
        importo: 142.17,
        indirizzo_cliente: "VIA GIUSEPPE LUCANTONI 1 GUALDO TADINO",
        lat_cliente: 43.2322369,
        long_cliente: 12.7803655,
        lat_negozio: 43.1070321,
        long_negozio: 12.402996209906487
        veicolo: 1 // for example
      },
      {
        "max(a.dataora_ord)": "2020-05-20T13:40:26.000Z",
        id_ordine: 14,
        id_cliente: "2266",
        id_negozio: "1",
        numero_prodotti: 15,
        importo: 110.19,
        indirizzo_cliente: "PIAZZA PALAZZO VECCHIO 1 SAN GEMINI",
        lat_cliente: 42.6143734,
        long_cliente: 12.5471666,
        lat_negozio: 43.1070321,
        long_negozio: 12.402996209906487,
        veicolo: 2 // for example
      },
      {
        "max(a.dataora_ord)": "2020-05-20T13:04:37.000Z",
        id_ordine: 5,
        id_cliente: "2485",
        id_negozio: "1",
        numero_prodotti: 7,
        importo: 35.76,
        indirizzo_cliente: "CORSO VECCHIO 133 TERNI",
        lat_cliente: 42.5624235,
        long_cliente: 12.649205,
        lat_negozio: 43.1070321,
        long_negozio: 12.402996209906487
        veicolo: 3 // for example
      },
      {
        "max(a.dataora_ord)": "2020-05-20T13:58:11.000Z",
        id_ordine: 3,
        id_cliente: "2260",
        id_negozio: "1",
        numero_prodotti: 16,
        importo: 95.31,
        indirizzo_cliente: "VIA LICINIO REFICE-PETRIGNANO 1 ASSISI",
        lat_cliente: 43.105579,
        long_cliente: 12.5263973,
        lat_negozio: 43.1070321,
        long_negozio: 12.402996209906487,
        veicolo: 1 // for example
      },
      ...
    ],

    ...

如何做到这一点?

这是我的堆栈闪电战:

stackblitz

谢谢。

【问题讨论】:

    标签: javascript angular lodash


    【解决方案1】:

    你可以试试这个

            const vehcord=[]
    route.forEach(x=>{
        for(let i=0;i<x.steps.length;i++){
        vehcord.push({vehicle:x.vehicle,location:x.steps[i].location})
        }})
    
    for (let [key, value] of Object.entries(consegne)) {
        vehcord.forEach(vkey=>{
                    value.forEach(x=>{
                if(x.long_cliente==vkey.location[0] && x.lat_cliente==vkey.location[1])
                      x.veicolo = vkey.vehicle
                    })
    
          })
      }
      console.log(consegne)
    

    【讨论】:

    • 感谢您的回复,您的解决方案非常有效。它仅将车辆钥匙用于第一个对象条目,而不是每个条目。这是您的解决方案link 的stackblitx,它如何适用于每个人?谢谢。
    • 我已经测试了代码并且它可以工作,你可以在jsfiddle上查看它。如果客户端经纬度匹配,它只会添加车辆 ID
    • 奇怪,你的工作,但如果你检查我的 stakblitz stackblitz 并在控制台中检查包含 12 个对象的数组,它只会将车辆添加到第一个对象而不是另一个对象,你可以检查一下堆栈闪电战,如果可以的话?我可以帮到我很多。谢谢
    • 我已经更新了代码,你现在可以试试,让我知道它是否有效
    • 我在您的 stackblitz 中注意到您的 consegne 是嵌套的,我根据您在此处粘贴的未嵌套的 sn-p 制作了代码,但是我现在已经调整了代码并使用它进行了测试来自你的 stackblitz 的完整数据,它可以工作
    猜你喜欢
    • 1970-01-01
    • 2022-11-02
    • 1970-01-01
    • 2021-07-24
    • 1970-01-01
    • 1970-01-01
    • 2013-12-31
    • 2020-10-12
    • 1970-01-01
    相关资源
    最近更新 更多