Как отобразить глубоко вложенный массив элементов из внешних данных - PullRequest
0 голосов
/ 02 июня 2019

Я делал картографию раньше, но не так глубоко вложенный. Я пытаюсь повторно заполнить данные из поврежденной БД. Я вручную восстановил массив заказов. Я пытаюсь найти данные для каждого игрока, а затем обновить поля (которые начинаются с нуля) для каждого игрока:

Пример: я начинаю с таких данных:

const orders = [
{
"paymentID": "ch_456", 
"paymentStatus": "PAID", 
"user": "kingkong@gmail.com", 
"cart": {
  "username": "kingkong@gmail.com", 
  "totalQty": 1, 
  "totalPrice": 80, 
  "items": [{
    "event": "Men's BB", 
    "division": "Men's", 
    "level": "BB", 
    "group": "nonpro", 
    "field": "PAL", 
    "day": "Saturday", 
    "numplayers": 2, 
    "price": 80, 
    "players": [{
      "avp_id": 1042641, 
      "first": "King", 
      "last": "Kong", 
      "waivers": [], 
      "completed": true, 
      "country": "USA", 
      "signed": false}, 
      {
      "avp_id": 1086117, 
      "first": "Jacob", 
      "last": "Ladder", 
      "waivers": [], 
      "completed": true, 
      "country": "USA", 
      "signed": false, 
      "shirt_size": "N/A"}], 
    "net": null, 
    "team": null, 
    "notes": null, 
    "paymentNote": null, 
    "waiversSent": false, 
    "active": true, 
    "paymentID": "ch_456", 
    "users": ["kingkong@gmail.com"], 
    "paymentStatus": "PAID", "__v": 4}]},
"__v": 0
},{
"paymentID": "ch_123",
"paymentStatus": "PAID",
"user": "marymac@aol.com",
"cart": {
  "username": "marymac@aol.com", 
  "totalQty": 1,
  "totalPrice": 50,
  "items": [{
    "event": "Junior Boys 16s",
    "division": "Junior Boys",
    "level": "16s",
    "group": "nonpro",
    "field": "Main",
    "day": "Friday",
    "numplayers": 2,
    "price": 80,
    "players": [{
      "avp_id": 1022228,
      "first": "Some",
      "last": "Kid",
      "waivers": [],
      "completed": true,
      "country": "USA",
      "signed": false
      }, {
      "avp_id": 1020142,
      "first": "Justin",
      "last": "Kid",
      "waivers": [],
      "completed": true,
      "country": "USA",
      "signed": false,
      "shirt_size": "N/A"
      }
    ], 
    "net": null, 
    "team": null, 
    "notes": null, 
    "paymentNote": null, 
    "waiversSent": false, 
    "active": true, 
    "paymentID": "ch_123", 
    "users": ["marymac@aol.com"], 
    "paymentStatus": "PAID", "__v": 4
    }
  ]
},
"__v": 0
}];

Вот мой код, который я хотел бы получить из API-интерфейса и обновить информацию об игроке, чтобы передать в функцию ниже:

async getLostData() {
    // get the lost orders
    console.log('start lost data import');
    // this.adminService.GetLostOrders().subscribe(orders => {
    //   console.log('load each order into system', orders);
orders.forEach(order => {
    order.cart.items.map(item => {
      const players = item.players.map(async player => {
         player = await 
           this.adminService.adminAVPReg(player.last, player.avp_id)
           .toPromise(); 
          console.log("updated player outside subscribe", player);
      });
      item.players = players;
      console.log("item", item);
    });
    // load order with updated info, create registration, and skip pmt
    // this.adminService.LoadLostOrders(order).subscribe(data => {
    //   console.log(data);
    //   console.log('finished');
    // });
  });
  console.log("orderlist", orders);
// });}

Данные, которые я получаю, интересны. Сначала из регистратора возвращается каждый элемент, затем список заказов, а затем обновленная информация об игроке. Каждый элемент показывает массив игроков, указанный как ZoneAwarePromise. Я понятия не имею, как заменить это фактическими данными, но я вижу, что они не записываются в том порядке, в котором я ожидал.

Как я могу вернуть элемент с обновленными данными?

item logged, showing ZoneAwarePromise for player data updated info logged

1 Ответ

1 голос
/ 02 июня 2019

Из того, что, как я понял, вы пытаетесь сделать, я придумал следующее:

this.adminService.GetLostOrders().pipe(
  mergeMap((orders: any[]) => from(orders).pipe(
    mergeMap((order) => from(order.cart.items)),
    mergeMap((item) => of(item).pipe(
      mergeMap(_ => from(item.players)),
      mergeMap(player => this.adminService.adminAVPReg(player.last, player.avp_id).pipe(
        map(newPlayer => { player = newPlayer; return player; }))
      ),
      toArray(),
      tap(newPlayerArray => item.players = newPlayerArray)
    )),
    toArray(),
    mergeMap(_ => this.adminService.LoadLostOrders(orders))
  ))
).subscribe();

Редактировать ОП. Я реализовал то, что вы поделились выше, и превратил это в:

getLostData() {
    // get the lost orders
    console.log('start lost data import');
    // get manually created orders from lostdata collection
    this.adminService.GetLostOrders()
    .pipe(
      mergeMap((orders: any) => from(orders).pipe(
        mergeMap((order: any) => from(order.cart.items)),
        mergeMap((item: any) => of(item).pipe(
          mergeMap(_ => from(item.players)),
          mergeMap((player: any) => this.adminService.adminAVPReg(player.last, player.avp_id).pipe(
            map((newPlayer: any) => { 
              player.avp_id = player.avp_id;
              player.signed = player.signed;
              player.waivers = player.waivers;
              player.country = player.country;
              player.completed = true;
              player.sandbagger = false;
              player.first = newPlayer.first;
              player.last = newPlayer.last;
              player.email = newPlayer.email;
              player.address = newPlayer.address;
              player.city = newPlayer.city;
              player.state = newPlayer.state;
              player.zip = newPlayer.zip;
              player.shirt_size = newPlayer.shirt_size;
              player.ranking = newPlayer.ranking;
              player.overallRanking = newPlayer.overallRanking;
              player.notes = player.notes;
              player.phone = newPlayer.phone;
              player.adult = newPlayer.adult;
              return player; }))
          ),
          toArray(),
          tap(newPlayerArray => item.players = newPlayerArray)
        )),
        toArray(),
        tap(_ => { this.loadlostOrders(orders);
        })
      ))
    )
    .subscribe();
  }

  loadlostOrders(orders) {
    orders.forEach(order => {
      this.adminService.LoadLostOrders(order).subscribe((data) => {
            console.log("success", JSON.stringify(data));
          }, (error) => {
            console.log("error", JSON.stringify(error));
          });
    });
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...