我正在尝试使用以下代码将一些对话消息推送到数组:
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数组,而是在控制台中输出以下内容:
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"
因此,最终的“对话”对象将覆盖每个数组元素。
有人可以告诉我为什么我的代码这样做?非常感谢提前
附:我可以上传更多代码,如果它能解决我的问题。
这是因为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);
});
试试这个:
for (let i of this.myConversations) {
for (let j of i.messages) {
this.myConversationMessages.push({
conversationId: i.conversationId,
messageId: j.messageId,
messageText: j.messageText
});
}
}
这将为每次迭代创建一个新对象
发生这种情况是因为您将引用对象添加到数组在您的示例中,您没有向数组添加3个对象,您添加了三个对象的三个引用三次。其中一个属性的变化导致所有其他属性发生变化。 它应该是有效的:
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);
}
}