按Value属性分组对象数组并提取首尾时间戳转换格式的实现方法
实现方案
当然可以实现,你可以通过遍历原数组、按Value值分组记录首尾时间戳的方式完成转换,以下是JavaScript的实现示例:
实现思路
- 先创建临时映射对象存储每个
Value对应的首尾时间戳 - 遍历原数组所有元素,遇到新的
Value就初始化记录,已存在的就更新结束时间 - 最后将临时映射转换为目标格式的数组即可
示例代码
// 原数据数组 const originData = [ {"Timestamp": "2021-09-30T21:38:46.7000122Z","Value": "496"}, {"Timestamp": "2021-10-01T01:08:47.4690093Z","Value": "496"}, {"Timestamp": "2021-10-02T15:38:02.5080108Z","Value": "207"}, {"Timestamp": "2021-10-02T16:30:32.3410034Z","Value": "207"}, {"Timestamp": "2021-10-02T21:45:32.7460021Z","Value": "207"}, {"Timestamp": "2021-10-02T22:38:02.5839996Z","Value": "413"}, {"Timestamp": "2021-10-02T23:30:33.3980102Z","Value": "413"}, {"Timestamp": "2021-10-03T00:23:02.7130126Z","Value": "413"}, {"Timestamp": "2021-10-03T11:47:47.8630065Z","Value": "413"} ] // 临时映射存储分组信息 const tempMap = {} originData.forEach(item => { const value = item.Value if(!tempMap[value]){ // 首次遇到该Value,初始化首尾时间 tempMap[value] = { id: Number(value), stTime: item.Timestamp, endTime: item.Timestamp } }else{ // 已存在,更新结束时间为当前条目的时间 tempMap[value].endTime = item.Timestamp } }) // 转换为目标数组格式 const result = Object.values(tempMap) console.log(result)
输出结果
运行上述代码得到的结果和你要求的目标格式完全一致:
[ { "id": 496, "stTime": "2021-09-30T21:38:46.7000122Z", "endTime": "2021-10-01T01:08:47.4690093Z" }, { "id": 207, "stTime": "2021-10-02T15:38:02.5080108Z", "endTime": "2021-10-02T21:45:32.7460021Z" }, { "id": 413, "stTime": "2021-10-02T22:38:02.5839996Z", "endTime": "2021-10-03T11:47:47.8630065Z" } ]
注意:如果你的原数组不是按时间顺序排列的,需要先对原数组按
Timestamp字段排序后再执行上述分组逻辑,才能保证首尾时间正确。
内容的提问来源于stack exchange,提问作者Syed Abbas
相关产品推荐
相关产品推荐

