首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Push函数似乎覆盖了Angular中的每个数组元素

Push函数似乎覆盖了Angular中的每个数组元素
EN

Stack Overflow用户
提问于 2019-03-20 03:50:14
回答 2查看 37关注 0票数 0

我正在尝试使用以下代码将一些会话消息推送到一个数组中:

代码语言:javascript
复制
myConversations: IConversation[] = [];
myConversationMessage: IConversationMessages = {
conversationId: 0,
messageId: 0,
messageText: ''
};
myConversationMessages: IConversationMessages[] = [];

this.conversationService.getConversations().subscribe(conversations => {
  this.myConversations = conversations;

  for (let i of this.myConversations) {
    this.myConversationMessage.conversationId = i.conversationId;       
    for (let j of i.messages) {
      this.myConversationMessage.messageId = j.messageId;
      this.myConversationMessage.messageText = j.messageText; 
      this.myConversationMessages.push(this.myConversationMessage);
    }
  }

  console.log(this.myConversationMessages);
});

我从一个JSON对象中检索会话&会话中的消息。不是将每条消息都推送到myConversationMessages数组,而是在控制台中输出以下内容:

代码语言:javascript
复制
0 
conversationId: 2
messageId:2
messageText: "testing"

1
conversationId: 2
messageId:2
messageText: "testing"

2
conversationId: 2
messageId:2
messageText: "testing"

3
conversationId: 2
messageId:2
messageText: "testing"

因此,最终的“对话”对象将覆盖每个数组元素。

有人能告诉我为什么我的代码会这么做吗?提前谢谢你

附言。我可以上传进一步的代码,如果它将澄清我的问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-20 04:01:18

因为JavaScript对象是通过引用传递的:

代码语言:javascript
复制
myConversationMessages: IConversationMessages[] = [];

this.conversationService.getConversations().subscribe(conversations => {
  this.myConversations = conversations;

  for (let i of this.myConversations) {
    this.myConversationMessage.conversationId = i.conversationId;       
    for (let j of i.messages) {
      this.myConversationMessage.messageId = j.messageId;
      this.myConversationMessage.messageText = j.messageText; 
      this.myConversationMessages.push(this.myConversationMessage); // <-= Here you are pushing a reference to the same object in every loop. In every loop you are updating the single object, and the reference in each array spot points to the same object
    }
  }

  console.log(this.myConversationMessages);
});

试试这个:

代码语言:javascript
复制
  for (let i of this.myConversations) {
    for (let j of i.messages) {
      this.myConversationMessages.push({
          conversationId: i.conversationId,
          messageId: j.messageId,
          messageText: j.messageText
      });
    }
  }

这将为每次迭代创建一个新对象。

票数 0
EN

Stack Overflow用户

发布于 2019-03-20 03:58:49

这是因为您将引用对象添加到数组中。在您的示例中,您没有向数组中添加3个对象,而是三次添加了一个对象的三个引用。其中一个属性的更改会导致所有其他属性的更改。

它应该是作品:

代码语言:javascript
复制
for (let i of this.myConversations) {
    this.myConversationMessage.conversationId = i.conversationId;       
    for (let j of i.messages) {
      let item = new IConversationMessages();
      item.messageId = j.messageId;
      item.messageText = j.messageText; 
      this.myConversationMessages.push(item);
    }
  }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55248989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档