array.forEach起作用,但是当我在里面嵌套另一个时不起作用

时间:2019-05-13 22:06:33

标签: javascript angular 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);
    })
  }

当我查看e.waivers [i] .has_signed的console.log时,数据是正确的,但是之后是不正确的。

要完成此工作我需要做什么?我试过在foreach中使用for循环,以及其他一堆东西。

提供给循环的数据提供如下信息:

{ 
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字段,并且消息应该显示“ 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 "View Waiver" link.

我得到的是1600条记录,这些记录显示了好像每个人都没有签名的url,但是当我在内部循环中console.log has_signed时,对于应该显示signatureUrl的记录则显示TRUE。

2 个答案:

答案 0 :(得分:2)

快速查看它,在return循环中有一个for语句,这将阻止它在第一次迭代后运行。

答案 1 :(得分:1)

首先将所有return语句放入代码中。接下来,使用{ "result":[0, 2] } 代替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; 绑定到模板中。