基于数组长度多次复制对象 - Angular 2 + / JavaScript

时间:2018-04-19 21:19:15

标签: javascript angular typescript object ionic-framework

我有一个空值的对象。我需要复制这个对象,但是我的一个数组的长度是很多倍。那么我会有两个具有相同属性但具有不同值的对象。

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'
        }
    ]

2 个答案:

答案 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);