Duplicera objekt flera gånger baserat på arraylängd - Angular 2+/ JavaScript
Jag har ett objekt med tomma värden. Jag behöver duplicera detta objekt så många gånger som längden på en av mina arrayer är. Då skulle jag ha två objekt med samma egenskaper men med olika värden.
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]
})
Problemet med den här metoden är att värdena slutar med att bli samma. Till exempel skulle båda objektens värde vara lika med 2. Jag känner att jag överanalyserar det här. Tack.
Vad jag skulle vilja som ett resultat ---
add = [
{
type: 'Package',
value: '1'
},
{
type: 'Package',
value: '2'
},
{
type: 'Package',
value: '3'
}
]
Svar #1
För att skapa en kopia av objektet 'obj', brukar jag använda Object.assign({}, obj)
du kan använda något liknande detta :
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]);
(som Daniel W Strimpel nämnde i sitt svar, var medveten om att det endast utför en ytlig kopia, om du har nästlade objekt bör du ha det i åtanke.)
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);Svar #2
Det finns ingen anledning att skapa en array av en viss storlek och fylla den med syntax som denna:
Array(this.form.value.packages.length).fill(this.add[0])
Du kan bara använda map-operatorn på din this.form.value.packages-array för att hoppa över allt det där arbetet:
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 });
});
Som en allmän notering gör Object.assign(...) en ytlig kopia vilket är okej för det exempelobjekt du hade, men om du har ett mer komplext objekt med egenskaper som är inbäddade objekt fungerar detta inte. I så fall skulle du behöva använda ett bibliotek som underscore för att göra en djup kopia av ditt this.add[0]-objekt.
Som @Eliseo påpekade i kommentaren nedan, om du verkligen har ett objekt så enkelt som du har visat, kan du helt enkelt göra:
let packages = this.form.value.packages.map(v => ({ type: 'Package', value: v }));
