使用相同的键动态合并对象数组并将其创建为新数据对象数组

问题描述

我有一些对象数组 我想合并具有相同键的对象数组,并根据键和值将其创建为新对象

const data =[{
  date:"19",status:"in",hour:”12:00”

},{

  date:"19",hour:”12:20”
},{
  date:"19",hour:”12:43”
},status:"out",hour:”16:16”

},{
  date:"20",hour:07:30”
},hour:”14:40”
},{
  date:"21",hour:”08:12”
}
]

这是我想要的结果


result =[{
date:”19”,hourIn= “12:00”,hourOut= “16:16”,},hourIn:"07:30",hourOut:14:40”
},hourIn:”08:12”,hourOut:”-“}]

我想如何解决这个问题?

解决方法

我是这样做的, 我遍历 data,检查该日期是否已经过去。

如果不是,我检查 statusin 还是 out,然后设置 hourdate

如果通过了,我检查了 status,然后检查小时是早于 hourIn 还是晚于已设置的 hourOut

let result={};
const data=[{date:"19",status:"in",hour:"12: 00"},{date:"19",hour:"12:20"},hour:"12:43"},status:"out",hour:"16:16"},{date:"20",hour:"07:30"},hour:"14:40"},{date:"21",hour:"08:12"}];

data.forEach(({ date,status,hour }) => {
  if (date in result) {
    if (status == 'in' && hour < result[date].hourIn) result[date].hourIn = hour;
    else if (status == 'out' && hour > result[date].hourOut) result[date].hourOut = hour;
  } else result[date] = {
    date,hourIn: status == 'in' ? hour : '-',hourOut: status == 'out' ? hour : '-'
  };
});

result = Object.values(result);
console.log(result);

,

您正在尝试实现一个迷你 MapReduce。你可以谷歌了解更多详情。

  1. 创建一个 Map,其中键是您的日期,值是具有相同日期的对象数组。

  2. 现在通过将所有对象插入到地图中来按日期隔离所有对象。

  3. 根据输入、输出作为第一条件和时间作为第二条件对数组进行排序。因此,在每个数组中,第一个对象将在时间最先,最后一个对象将在时间最后。

  4. 使用第一个和最后一个对象将每个数组减少到一个对象中。

    let map = new Map();

    for(让 d 的数据){ 让 t = map.get(d.date)||[]; t.push(d); map.set(d.date,t); }

    for(let v of map.values()){ v.sort((a,b)=>a.status

    让结果 = []

    for(let v of map.values()){ let reduce = // 从 v[0] v[v.length-1] 获取 结果。推(减少); }

,

既然我已经这样做了,我不确定它会增加多少,但这里有一种使用 reduce 的方法:

0