array.forEach работает, но не тогда, когда я вкладываю другой внутрь - PullRequest
0 голосов
/ 14 мая 2019

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

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"
}

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

Визуальное отображение того, что возвращается в моей таблице: You can see the has_signed are displaying as true on some, but the Liability URL is displaying instead of the

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

Ответы [ 2 ]

2 голосов
/ 14 мая 2019

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

1 голос
/ 14 мая 2019

Прежде всего отбросьте все операторы возврата в вашем коде. Затем используйте 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 в свой шаблон.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...