我有一个空值的对象。我需要复制这个对象,但是我的一个数组的长度是很多倍。那么我会有两个具有相同属性但具有不同值的对象。
TS
add = [
{
type: 'Package',
value: ''
}
]
this.form.value.packages = [1,2,3]
//This should duplicate the object based on length of packages
let packageDup = Array(this.form.value.packages.length).fill(this.add[0])
packageDup.forEach((res, i) => {
packageDup[i].value = this.form.value.packages[i]
})
此方法的问题是值最终相同。例如,两个对象的值都等于2.我觉得我已经过度思考了这个。感谢。
我想要的结果---
add = [
{
type: 'Package',
value: '1'
},
{
type: 'Package',
value: '2'
},
{
type: 'Package',
value: '3'
}
]
答案 0 :(得分:2)
没有理由创建一个特定大小的数组并使用如下语法填充它:
Array(this.form.value.packages.length).fill(this.add[0])
您可以使用map
数组上的this.form.value.packages
运算符跳过所有这些工作:
add = [
{
type: 'Package',
value: ''
}
]
this.form.value.packages = [1,2]
let packages = this.form.value.packages.map(v => {
return Object.assign({}, this.add[0], { value: v });
});
作为一般说明,Object.assign(...)
执行浅拷贝,这对于您拥有的示例对象来说很好,但是如果您有一个更复杂的对象,其属性是嵌套对象,那么这将无法正常工作。在这种情况下,您需要使用像下划线这样的库来深度克隆您的this.add[0]
对象。
正如@Eliseo在下面的评论中指出的那样,如果你确实有一个像你所示的那样简单的对象,你可以简单地做:
let packages = this.form.value.packages.map(v => ({ type: 'Package', value: v }));
答案 1 :(得分:1)
要创建对象的副本,我通常会使用Object.assign({}, obj)
你可以使用这样的东西:
let packageDup = Array(this.form.value.packages.length)
.fill(0) // needed to have some value and no empty value that would cause map to fail.
.map(x => Object.assign({}, this.add[0]);
(正如Daniel W Strimpel在他的回答中提到的那样,请注意它只执行浅拷贝,如果你有嵌套对象,你应该牢记这一点。)
let baseObject = { value: 1 }
let array = Array(3).fill(0).map(x => Object.assign({}, baseObject));
console.log(array);
array[1].value = 2;
array[2].value = 3;
console.log(array);