Tengo 2 objetos y quiero 'trasplantar' valores de un objeto al otro.
El primer objeto del que estoy extrayendo datos se ve así:
var userData = { Data: [ { Amount: 430140.68, Year: "2015", AccountName: "Account 1" }, { Amount: 458997.32, Year: "2016", Name: "Account 2" }, ] }El segundo objeto en el que estoy colocando datos se ve así:
[ { "name": "Account 1", "data": [ 0, 0 ], }, { "name": "Account 2", "data": [ 0, 0 ], } ] Mi objetivo es tomar la Amount del primer objeto y colocarlo en la matriz de data del segundo. Cada año corresponde a un valor en la matriz 'datos'.
Entonces, el objeto actualizado resultante debería verse así:
[ { "name": "Account 1", "data": [ 430140.68, 0 ], }, { "name": "Account 2", "data": [ 0, 458997.32 ], } ]Para intentar lograr esto tengo el siguiente código:
const yearArrLength = yearsArr.length; const generatedObj = new Array(yearArrLength).fill(0); // Push name and populate data array with 0s. for (var key of Object.keys(userData.Data)) { var accName = userData.Data[key].AccountName; if (!generatedObj.find(key => key.name === accName)){ generatedObj.push({'name': accName, 'data': blankDataArr}); } } for (var key of Object.keys(userData.Data)) { var accName = userData.Data[key].AccountName; var accAmount = userData.Data[key].Amount; var accYear = userData.Data[key].Year; // Get location of years array value var yearArrIndex = yearsArr.indexOf(accYear); for (var key of Object.keys(generatedObj)) { if (generatedObj[key].name == accName) { generatedObj[key].data[yearArrIndex] = accAmount; } } }Sin embargo, esto parece llenar todos los valores de la matriz de datos, por ejemplo:
[ { "name": "Account 1", "data": [ 430140.68, 458997.32 ], }, { "name": "Account 2", "data": [ 430140.68, 458997.32 ], } ] Estoy completamente perplejo en cuanto a por qué. La declaración if debería verificar si hay un nombre de cuenta coincidente, pero no parece activarse.
¿Alguien sabría que he hecho mal?
Parece que está presionando exactamente el mismo blankDataArr cada vez: no está presionando una nueva matriz, está presionando la misma matriz para todos.
Para un ejemplo más mínimo:
const subarr = []; const arr = [subarr, subarr]; arr[0].push('x'); console.log(JSON.stringify(arr)); // both items in `arr` have changed // because both refer to the exact same subarr object Para lo que está tratando de hacer, parece que sería mucho más fácil hacer un objeto o mapa indexado por AccountName primero, de esa manera solo tiene que acceder o crear la propiedad AccountName mientras itera, y asignar a la apropiada año.
const yearsArr = ['2015', '2016']; const userData = { Data: [ { Amount: 430140.68, Year: "2015", AccountName: "Account 1" }, { Amount: 458997.32, Year: "2016", AccountName: "Account 2" }, ] }; const dataByAccountName = new Map(); for (const { AccountName, Amount, Year } of userData.Data) { if (!dataByAccountName.has(AccountName)) { // Create an entirely new array: dataByAccountName.set(AccountName, yearsArr.map(() => 0)); } const index = yearsArr.indexOf(Year); dataByAccountName.get(AccountName)[index] = Amount; } const result = [...dataByAccountName.entries()].map(([name, data]) => ({ name, data })); console.log(result);