tengo datos en este formato
const ChkdArr = [ { date: "2022-05-25", itemId: 29, quantity: 4, }, { date: "2022-05-26", itemId: 29, quantity: 2, }, { date: "2022-05-25", itemId: 36, quantity: 7, }, { date: "2022-05-25", itemId: 36, quantity: 4, }, { date: "2022-05-27", itemId: 36, quantity: 2, }, { date: "2022-05-28", itemId: 47, quantity: 1, }, ];tengo problemas para obtener una nueva matriz con aquellos datos cuyo itemid es el mismo y en esos elementos, si la fecha es la misma, resuma su cantidad.
Quiero que el resultado se vea así. Estoy aplicando mapas y filtros, pero mis datos se repiten y tienen resultados incorrectos.
const DateSortArr = [{ itemId: 29, date: [ { date: "2022-05-25", quantity: 4 }, { date: "2022-05-26", quantity: 2 }, ], }, { itemId: 36, date: [ { date: "2022-05-25", quantity: 11 }, { date: "2022-05-27", quantity: 2 }, ],}, { itemId: 47, date: [{ date: "2022-05-25", quantity: 1 }], }, ];Hola, no sé si te entendí, pero usas esta diversión:
function groupBy(collection, property) { var i = 0, val, index, values = [], result = []; for (; i < collection.length; i++) { val = collection[i][property]; index = values.indexOf(val); if (index > -1) result[index].push(collection[i]); else { values.push(val); result.push([collection[i]]); } } return result; } const ChkdArr = [ { date: "2022-05-25", itemId: 29, quantity: 4, }, { date: "2022-05-26", itemId: 29, quantity: 2, }, { date: "2022-05-25", itemId: 36, quantity: 7, }, { date: "2022-05-25", itemId: 36, quantity: 4, }, { date: "2022-05-27", itemId: 36, quantity: 2, }, { date: "2022-05-28", itemId: 47, quantity: 1, }, ]; var obj = groupBy(ChkdArr, "date"); console.log(obj)const ChkdArr = [ { date: "2022-05-25", itemId: 29, quantity: 4, }, { date: "2022-05-26", itemId: 29, quantity: 2, }, { date: "2022-05-25", itemId: 36, quantity: 7, }, { date: "2022-05-25", itemId: 36, quantity: 4, }, { date: "2022-05-27", itemId: 36, quantity: 2, }, { date: "2022-05-28", itemId: 47, quantity: 1, }, ]; let answer = []; ChkdArr.map(item =>{ let id = answer.findIndex(it =>it.itemId === item.itemId); if(id === - 1 ){ answer.push({itemId: item.itemId, data: [{date: item.date, quantity: item.quantity}]}) }else{ answer [id] = {itemId: item.itemId, data: [...answer[id].data, {date: item.date, quantity: item.quantity}]} } }) console.log(answer)Esto se puede hacer de manera eficiente utilizando un mapa y una nueva matriz de salida. En el mapa, almacenaremos la clave como itemId y el valor como su índice en la matriz de salida. Luego, recorreremos los datos y veremos si el itemId tiene un índice en el mapa, si es así, buscaremos el valor del elemento en la matriz de salida y actualizaremos el valor de la fecha actual en consecuencia; de lo contrario, crearemos un nuevo objeto para ese elemento en la matriz. El siguiente código hace precisamente eso.
const data = [ { date: "2022-05-25", itemId: 29, quantity: 4, }, { date: "2022-05-26", itemId: 29, quantity: 2, }, { date: "2022-05-25", itemId: 36, quantity: 7, }, { date: "2022-05-25", itemId: 36, quantity: 4, }, { date: "2022-05-27", itemId: 36, quantity: 2, }, { date: "2022-05-28", itemId: 47, quantity: 1, }, ]; let output = []; let itemIdToIndexMap = {}; data.forEach(item => { const itemIndex = itemIdToIndexMap[item.itemId]; if(itemIndex !== undefined) { const itemArray = output[itemIndex]; const itemWithCurrentDate = itemArray.date.find(newItem => item.date === newItem.date); if(itemWithCurrentDate) { itemWithCurrentDate.quantity += item.quantity; } else { itemArray.date.push({date: item.date, quantity: item.quantity}); } } else { output.push({itemId: item.itemId, date: [{date: item.date, quantity: item.quantity}]}); itemIdToIndexMap[item.itemId] = output.length - 1; } }); console.log(JSON.stringify(output));