array.forEach работает, но не тогда, когда я вкладываю другой внутрь

У меня есть две страницы, над которыми я работаю, и обе возвращают массив объектов. Когда я использую следующий код, новые результаты работают:

this.adminService.waiversGetAll()
    .subscribe((data: Waiver[]) => {
      this.waivers = data;
      this.waivers.forEach((e) => {
        if(e.has_signed === true) {
          e.url = `<a href="${e.signatureUrl}">View</a>`
        } else {
          e.url = `<a href="${e.url}">${e.message}</a>`;
        }
        return e;
      });
      console.log(this.waivers);
    })
  }

Но когда я пытаюсь сделать то же самое с другим массивом (где мне нужно обновить значения массива, вложенного в него), я не получаю обновленные значения:

this.adminService.GetUnsignedWaivers()
    .subscribe((data: Player[]) => {
      console.log("data",data);
      data.forEach(e => {
        let record: Object = {};
        for(let i = 0; i < e.waivers.length; i++) {
          console.log(e.waivers[i].has_signed);
          if (e.waivers[i].has_signed === true) {
            e.waivers[i].url = e.waivers[i].signatureUrl;
            console.log(e.waivers[i].url);
            e.waivers[i].message = "View Waiver";
          } else {
            e.waivers[i].url = e.waivers[i].url;
            e.waivers[i].message = e.waivers[i].message;
          }
          console.log(e.waivers[i].message);
          return;
          };
          return e;
      });
      this.size = this.players.length;
      console.log(this.players);
    })
  }

Когда я смотрю на console.log e.waivers [i] .has_signed, данные верны, но после этого они не верны.

Что я должен сделать, чтобы сделать эту работу? Я попытался использовать цикл for внутри foreach и кучу других вещей.

Данные, передаваемые в цикл, предоставляют такую ​​информацию:

{ 
buyer: "email@someaddress.edu"
event: "COED A"
field: "Main"
net: null
player: {shirtSize: null, avp_id: 12345678, adult: true, …}
team: null
waivers: [{
email: "someemail@gmail.com",
has_signed: true,
message: "Liability Waiver",
signatureUrl: "https://somelink.pdf",
url: "https://somelink.com/somekeyidentifier"
}

Если игрок подписал отказ, появится поле signatureUrl, а в сообщении должно быть указано «Просмотреть отказ», а не сообщение о том, какой тип отказа они подпишут. Я хочу, чтобы URL-адрес был установлен на signatureUrl, если они подписаны, поэтому я могу использовать его в таблице, которая не любит манипулирование данными.

Визуал того, что возвращается в моей таблице: Вы можете видеть, что has_signed на некоторых отображается как true, но вместо ссылки «Просмотреть отказ» отображается URL-адрес ответственности.

Все, что я получаю, это 1600 записей, показывающих URL, как будто все не подписали, но когда я console.log has_signed во внутреннем цикле, он показывает TRUE для тех, которые вместо этого должны показывать signatureUrl.

Всего 2 ответа


Прежде всего отбросьте все операторы return в вашем коде. Далее, используйте map вместо forEach как первый возвращает вам новый манипулируемый массив, а второй используется только для итерационных целей.

Ваш код в subscribe становится:

data.waivers = data.waivers.map((waiver) => {
    if (waiver.has_signed) { 
        // your logic goes here... 
        waiver.url = waiver.signatureUrl;
        waivers.message = "View Waiver";
    }
    // No else is required as you are just reassigning with same values
});
this.playerDetails = data;

Наконец свяжите эти измененные data в свой шаблон.


Если вы быстро посмотрите на это, у вас в операторе for есть оператор return , который остановит его выполнение после первой итерации.


Есть идеи?

10000