Angular 9 在 object 数组中更新 object
Angular 9 update object in array of objects
正如标题所说,我需要更新数组中的一个值。
<div *ngFor="let item of data; let i = index" >
<div class="full-w" fxLayout='row' fxLayoutAlign='start center' fxLayoutGap='12px'>
<span class="title">Color: </span>
<span>{{item.color}}</span>
</div>
<mat-divider class="full-w"> </mat-divider>
<div *ngFor="let e of item.sizeQuantity; let j = index" fxLayout='row' fxLayoutAlign='space-between center'
fxLayoutGap='12px'>
<span class="title">Size: </span>
<span class="size">{{e.size}}</span>
<mat-form-field>
<input matInput type="number" placeholder="Quantity" [value]="e.quantity" #quantity />
</mat-form-field>
<button mat-button (click)="updateQuantity(quantity.value, item, i, j)">Add</button>
</div>
</div>
这是初始数据
当我在一个字段中输入数据时,例如在 black>xs 下,它也会在 beige>xs 上改变(如果有 blue>xs 或更多,它会更新)
我尝试了几种方法,但它不断更新每个位置的值
updateQuantity(value, item, ind, j) {
this.data.forEach(e => {
if (e.color == item.color) {
e.sizeQuantity[j].quantity = parseInt(value);
}
})
}
或者像这样
updateQuantity(value, item, ind, j) {
this.data.find(e => e.color == item.color).sizeQuantity[j].quantity = parseInt(value);
}
我是不是漏掉了什么?
//编辑:
数据是这样创建的:
let quantity = [];
let sizeQuantity = [];
this.selectedSizes.forEach(e => {
sizeQuantity.push({ size: e, quantity: 0 })
})
this.selectedColors.forEach(e => {
quantity.push({ color: e, sizeQuantity })
})
this.dialog.open(AddQuantityComponent, {
data: quantity
})
根据用户选择动态创建大小和颜色数组:
this.selectedColors = ['black', 'beige', 'blue'];
this.selectedSizes = ['XS', 'S'];
quantity
值在每种颜色中更新,因为它们共享相同的 sizeQuantity
实例。问题根源在于这个方法
this.selectedColors.forEach(e => {
quantity.push({ color: e, sizeQuantity })
})
此处必须从 sizeQuantity
创建深拷贝,这意味着可以使用以下内容:
this.selectedColors.forEach(e => {
let sq = JSON.parse(JSON.stringify(sizeQuantity));
quantity.push({ color: e, sizeQuantity: sq });
});
使用JSONserialize/deserialize创建深拷贝比较麻烦,但这是最简单,最向后兼容的方法。有关创建深层复制的更多详细信息,请查看 this Whosebug conversation.
正如标题所说,我需要更新数组中的一个值。
<div *ngFor="let item of data; let i = index" >
<div class="full-w" fxLayout='row' fxLayoutAlign='start center' fxLayoutGap='12px'>
<span class="title">Color: </span>
<span>{{item.color}}</span>
</div>
<mat-divider class="full-w"> </mat-divider>
<div *ngFor="let e of item.sizeQuantity; let j = index" fxLayout='row' fxLayoutAlign='space-between center'
fxLayoutGap='12px'>
<span class="title">Size: </span>
<span class="size">{{e.size}}</span>
<mat-form-field>
<input matInput type="number" placeholder="Quantity" [value]="e.quantity" #quantity />
</mat-form-field>
<button mat-button (click)="updateQuantity(quantity.value, item, i, j)">Add</button>
</div>
</div>
这是初始数据
当我在一个字段中输入数据时,例如在 black>xs 下,它也会在 beige>xs 上改变(如果有 blue>xs 或更多,它会更新)
我尝试了几种方法,但它不断更新每个位置的值
updateQuantity(value, item, ind, j) {
this.data.forEach(e => {
if (e.color == item.color) {
e.sizeQuantity[j].quantity = parseInt(value);
}
})
}
或者像这样
updateQuantity(value, item, ind, j) {
this.data.find(e => e.color == item.color).sizeQuantity[j].quantity = parseInt(value);
}
我是不是漏掉了什么?
//编辑:
数据是这样创建的:
let quantity = [];
let sizeQuantity = [];
this.selectedSizes.forEach(e => {
sizeQuantity.push({ size: e, quantity: 0 })
})
this.selectedColors.forEach(e => {
quantity.push({ color: e, sizeQuantity })
})
this.dialog.open(AddQuantityComponent, {
data: quantity
})
根据用户选择动态创建大小和颜色数组:
this.selectedColors = ['black', 'beige', 'blue'];
this.selectedSizes = ['XS', 'S'];
quantity
值在每种颜色中更新,因为它们共享相同的 sizeQuantity
实例。问题根源在于这个方法
this.selectedColors.forEach(e => {
quantity.push({ color: e, sizeQuantity })
})
此处必须从 sizeQuantity
创建深拷贝,这意味着可以使用以下内容:
this.selectedColors.forEach(e => {
let sq = JSON.parse(JSON.stringify(sizeQuantity));
quantity.push({ color: e, sizeQuantity: sq });
});
使用JSONserialize/deserialize创建深拷贝比较麻烦,但这是最简单,最向后兼容的方法。有关创建深层复制的更多详细信息,请查看 this Whosebug conversation.