A partir del siguiente fragmento, tengo que recorrer todos los recibos, obtener el número de recibo y agregar ese objeto al JSON. Pero obtengo el mismo recibo en dos JSON. ¿Dónde me estoy perdiendo? ¿Alguien puede ayudar? Gracias por adelantado.
const shopList = []; const shop = { "shopNumber": "2242461", "shopDate": "2020-06-13T00:00:00.000-05:00", "shopAmount": "100", "shopBank": "HDFC", "shopDetails": { "shopNumber": "1242461", "shopDate": "2020-06-13T00:00:00.000-05:00", "shopBank": "HDFC", "shopAmount": "100" }, "receiptDetails": [{ "userNumber": "115729", "receiptNumber": "temp1" }, { "userNumber": "115726", "receiptNumber": "temp2" } ] }; shop.receiptDetails.forEach((receipt) => { var temp = shop.shopDetails; temp.receiptNumber = receipt.receiptNumber; shopList.push({ shopNumber: shop.shopNumber, userNumber: Number(receipt.userNumber), receiptNumber: receipt.receiptNumber, shopDetails: temp, isSync: 0 }); }); shopList.forEach((receipt) => { console.log(receipt); });Estoy obteniendo salida como
{ shopNumber: '2242461', userNumber: 115729, receiptNumber: 'temp1', shopDetails: { shopNumber: '1242461', shopDate: '2020-06-13T00:00:00.000-05:00', shopBank: 'HDFC', shopAmount: '100', receiptNumber: 'temp2' ----**this should be temp1** }, isSync: 0 } { shopNumber: '2242461', userNumber: 115726, receiptNumber: 'temp2', shopDetails: { shopNumber: '1242461', shopDate: '2020-06-13T00:00:00.000-05:00', shopBank: 'HDFC', shopAmount: '100', receiptNumber: 'temp2' }, isSync: 0 }Estas dos líneas están causando el número de recibo duplicado ya que esencialmente está agregando el mismo objeto JSON a shopList . Solo queda la última actualización.
var temp = shop.shopDetails; temp.receiptNumber = receipt.receiptNumber; Te recomiendo que clones shopDetails a los que agregas número de receiptNumber .
var temp = JSON.parse(JSON.stringify(shop.shopDetails));Aquí está su código modificado:
const shopList = []; const shop = { "shopNumber": "2242461", "shopDate": "2020-06-13T00:00:00.000-05:00", "shopAmount": "100", "shopBank": "HDFC", "shopDetails": { "shopNumber": "1242461", "shopDate": "2020-06-13T00:00:00.000-05:00", "shopBank": "HDFC", "shopAmount": "100" }, "receiptDetails": [{ "userNumber": "115729", "receiptNumber": "temp1" }, { "userNumber": "115726", "receiptNumber": "temp2" } ] }; shop.receiptDetails.forEach((receipt) => { var temp = JSON.parse(JSON.stringify(shop.shopDetails)); temp.receiptNumber = receipt.receiptNumber; shopList.push({ shopNumber: shop.shopNumber, userNumber: Number(receipt.userNumber), receiptNumber: receipt.receiptNumber, shopDetails: temp, isSync: 0 }); }); shopList.forEach((receipt) => { console.log(receipt); });Eso es porque temp es una referencia a shop.shopDetails . Los objetos en JavaScript se pasan por referencia, cuando asigna temp.receiptNumber , es igual a shop.shopDetails.receiptNumber . Por lo tanto, el valor temp que obtiene en las próximas iteraciones se transfiere de la última iteración.
Lea más sobre cómo funciona la variable de objetos javascript en esta respuesta , creo que lo explica muy bien.
En cuanto a su enfoque, una de las muchas formas en que podría resolverlo es clonar el objeto de shop.shopDetails en cada iteración, por lo tanto, obtendrá un nuevo objeto en su lugar.
P.ej
const shopList = []; const shop = { "shopNumber": "2242461", "shopDate": "2020-06-13T00:00:00.000-05:00", "shopAmount": "100", "shopBank": "HDFC", "shopDetails": { "shopNumber": "1242461", "shopDate": "2020-06-13T00:00:00.000-05:00", "shopBank": "HDFC", "shopAmount": "100" }, "receiptDetails": [{ "userNumber": "115729", "receiptNumber": "temp1" }, { "userNumber": "115726", "receiptNumber": "temp2" }] }; shop.receiptDetails.forEach((receipt) => { var temp = {...shop.shopDetails}; // This is to clone an object, there are other ways than this. temp.receiptNumber = receipt.receiptNumber; shopList.push({ shopNumber: shop.shopNumber, userNumber: Number(receipt.userNumber), receiptNumber: receipt.receiptNumber, shopDetails: temp, isSync: 0 }); }); shopList.forEach((receipt) => { console.log(receipt); });