Tengo datos JSON como este:
"Data": [ { "time": "18:40:43", "count": 7, "endTime": "15:46:25", "date": "2019-01-16", "dow": "Thursday" }, { "count": 11, "time": "16:39:52", "endTime": "19:41:03", "dow": "Thursday", "date": "2019-01-16" }, ] Quiero fusionar dos objetos en esta matriz, pero tiene las mismas propiedades como date , dow
al final quiero representar datos como este:
"Data": [ { "time": "16:39:52", "count": 18, "date": "2019-01-16", "dow": "Thursday" "endTime": "19:41:03", }, ] time : debe ser el menor de ambos objetos y endTime debe ser el mayor de ambos, el count debe ser la suma de ambos. date y dow es común en ambos objetos
¿Cómo puedo fusionar estos objetos de esta manera en el nodo JS?
const data=[ { "time": "18:40:43", "count": 7, "endTime": "15:46:25", "date": "2019-01-16", "dow": "Thursday" }, { "count": 11, "time": "16:39:52", "endTime": "19:41:03", "dow": "Thursday", "date": "2019-01-16" }, ]; let date=(time)=>new Date().setHours(...time.split(":")); let newData=[]; data.forEach((item)=>{ let findItem=newData.findIndex((e)=>e.date===item.date && e.dow===item.dow); if(findItem!=-1){ let find=data.filter((e)=>e.dow===item.dow && e.date===item.date); let time=find.filter((i)=>find.find(i2=>date(i2.time)>date(i.time))); let endTime=find.filter((i)=>find.find(i2=>date(i2.endTime)<date(i.endTime))); item.endTime=endTime?.[0]?.endTime || item?.endTime; item.time=time?.[0]?.time || item?.time; item.count=find.map((e)=>e.count).reduce((partialSum, a) => partialSum + a, 0); let findItem=newData.findIndex((e)=>e.date===item.date && e.dow===item.dow); if(findItem!=-1) newData.splice(findItem,1); newData.push(item); } else newData.push(item); }); console.log(newData);Aquí hay una respuesta simple y legible:
const data = [ { time: "18:40:43", count: 7, endTime: "15:46:25", date: "2019-01-16", dow: "Thursday", }, { count: 11, time: "16:39:52", endTime: "19:41:03", dow: "Thursday", date: "2019-01-16", }, ]; const mergeObjects = (data) => { mergedObj = { ...data[0] }; for (i = 1; i < data.length; i++) { const obj = data[i]; for (const key in obj) { switch (key) { case "count": mergedObj.count = (mergedObj.count || 0) + obj.count; case "time": mergedObj.time = mergedObj.time < obj.time ? mergeObjects.time : obj.time; case "endTime": mergedObj.endTime = mergedObj.endTime > obj.endTime ? mergeObjects.endTime : obj.endTime; } } } return mergedObj; }; console.log(mergeObjects(data)); { "time": "16:39:52", "count": 18, "date": "2019-01-16", "dow": "Thursday" "endTime": "19:41:03", },Asumiendo
Pase los valores a la función de utilidad constructJSON que devolvería el valor formateado
var Data = [ { "time": "18:40:43", "count": 7, "endTime": "15:46:25", "date": "2019-01-16", "dow": "Thursday" }, { "count": 11, "time": "16:39:52", "endTime": "19:41:03", "dow": "Thursday", "date": "2019-01-16" }, ] function constructJSON(data) { const returnData = {} returnData['count'] = data[0].count + data[1].count returnData['date'] = data[0].date // since its common for both returnData['dow'] = data[0].dow // since its common for both returnData['time'] = parseInt(data[0].time.split(':').join(''),10) < parseInt(data[1].time.split(':').join(''),10) ? data[0].time:data[1].time; returnData['endTime'] = parseInt(data[0].endTime.split(':').join(''),10) > parseInt(data[1].endTime.split(':').join(''),10) ? data[0].endTime:data[1].endTime; return returnData } console.log(constructJSON(Data))