Javascript ArrayPush正在覆盖对象数组
目标将表中的选定对象添加到对象数组中 我有一个数据表,每行都有一个选择复选框。 选中该复选框后,所选行(对象)将传递给方法Javascript ArrayPush正在覆盖对象数组,javascript,arrays,angular,Javascript,Arrays,Angular,目标将表中的选定对象添加到对象数组中 我有一个数据表,每行都有一个选择复选框。 选中该复选框后,所选行(对象)将传递给方法 <ng-container #cmsTable *cdkVirtualFor="let cms of cmsContent | searchFilter: searchText : count | slice: (page-1) * pageSize : (page-1) * pageSize + pageSize">
<ng-container #cmsTable *cdkVirtualFor="let cms of cmsContent | searchFilter: searchText : count | slice: (page-1) * pageSize : (page-1) * pageSize + pageSize">
<tr style="width: 100%; min-height: 30px;">
<td style="word-wrap: break-word;max-width: 200px;">{{cms.buName}}
</td>
<td style="word-wrap: break-word;max-width: 200px;">{{cms.category}}
</td>
<td style="word-wrap: break-word;max-width: 200px;">
{{cms.contentTitle}}</td>
<td style="word-wrap: break-word;max-width: 200px;"><a
href="{{cms.contentURL}}" target="_blank">{{cms.contentURL}}</a>
</td>
<td style="word-wrap: break-word;max-width: 200px;"> {{cms.contentInfo}}
</td>
<td style="word-wrap: break-word;max-width: 200px;">{{cms.contentType}}
</td>
<td>
<div class="custom-control custom-checkbox">
<input type="checkbox" (change)="addToSelectedList($event, cms)">
</div>
</td>
</tr>
</ng-container>
}
当进行第一次选择时,它会毫无问题地将其添加到数组中。
当进行第二次选择时,阵列将显示第二个对象两次
[{第二选择},{第二选择}]
而不是[{first selection},{second selection}]
有什么想法吗?您只处理一个对象,可以重用和修改该对象,然后在数组中再次推送。但是,同样的对象在数组中存在两次。无论您是通过阵列的第一个插槽还是第二个插槽访问该对象,您对该对象所做的任何操作都将可见
要避免这种情况,请确保创建新对象。当您复制周围的内容时,有几个地方可以决定创建新对象。这只是您可以更改代码的众多地方之一:
更改:
this.trainingList.push(this.currTrainSelect);
致:
您只能使用一个对象,可以重用和修改该对象,然后在数组中再次推送该对象。但是,同样的对象在数组中存在两次。无论您是通过阵列的第一个插槽还是第二个插槽访问该对象,您对该对象所做的任何操作都将可见
要避免这种情况,请确保创建新对象。当您复制周围的内容时,有几个地方可以决定创建新对象。这只是您可以更改代码的众多地方之一:
更改:
this.trainingList.push(this.currTrainSelect);
致:
因为你在推一个引用因为你在推一个有效的引用!我完全没有看到arr.push([element1[,…[,elementN]])没有意识到。。。做我不得不选择不同的对象,cms和training除了id属性外都是类似的,因为如果我决定将分配的培训存储在单独的db表中,我可能会在后端将它们用作一个模型的主对象,而在另一个模型中使用外部对象。这与接受多个参数无关。它仍然有一个论点。
{…}
语法将生成对象的浅层副本。它类似于Object.assign({},this.currtainselect)
,这很有效!我完全没有看到arr.push([element1[,…[,elementN]])没有意识到。。。做我不得不选择不同的对象,cms和training除了id属性外都是类似的,因为如果我决定将分配的培训存储在单独的db表中,我可能会在后端将它们用作一个模型的主对象,而在另一个模型中使用外部对象。这与接受多个参数无关。它仍然有一个论点。{…}
语法将生成对象的浅层副本。它类似于Object.assign({},this.currtainselect)
。
this.trainingList.push({...this.currTrainSelect});