Javascript 使用条件合并数组中的连续对象,并更新合并的元素
给定一组表示按日期排序的车辆路径的对象,在以下情况下,合并连续元素的最有效方法是什么:Javascript 使用条件合并数组中的连续对象,并更新合并的元素,javascript,node.js,arrays,Javascript,Node.js,Arrays,给定一组表示按日期排序的车辆路径的对象,在以下情况下,合并连续元素的最有效方法是什么: 区域中的开始位置和区域中的结束位置均为真 区域中的开始位置和区域中的结束位置均为false 如果对象被合并,我们将通过以下方式更新阵列: 开始日期=第一个合并元素的开始日期 结束日期=最后一个合并元素的结束日期 持续时间=所有合并持续时间的总和 start_index=旧数组中第一个合并元素的索引 end_index=旧数组中最后一个合并元素的索引 如果两者都为false,则state=“out\u z
- 区域中的开始位置和区域中的结束位置均为真
- 区域中的开始位置和区域中的结束位置均为false
- 开始日期=第一个合并元素的开始日期
- 结束日期=最后一个合并元素的结束日期
- 持续时间=所有合并持续时间的总和
- start_index=旧数组中第一个合并元素的索引
- end_index=旧数组中最后一个合并元素的索引
- 如果两者都为false,则state=“out\u zone”
- 如果两者都为真,则state=“in_zone”
- 我们保留它(不合并)
- 开始索引和结束索引=旧数组中的索引
- state=“to_zone”if(在_zone中的开始位置=false,在_zone中的结束位置=true)
- state=“from_zone”if(开始_-location_在_-zone==true,结束_-location_在_-zone==false)
[
{
“开始日期”:“2020-10-07T13:53:26.000”,
“结束日期”:“2020-10-07T14:55:49.000”,
“启动区域中的位置”:false,
“结束位置在区域中”:false,
“持续时间”:143000
},
{
“开始日期”:“2020-10-07T15:53:26.000”,
“结束日期”:“2020-10-07T16:55:49.000”,
“启动区域中的位置”:false,
“结束位置在区域中”:正确,
“持续时间”:7000
},
{
“开始日期”:“2020-10-07T17:53:26.000”,
“结束日期”:“2020-10-07T18:55:49.000”,
“启动区域中的位置”:真,
“结束位置在区域中”:正确,
“持续时间”:20000
},
{
“开始日期”:“2020-10-07T19:53:26.000”,
“结束日期”:“2020-10-07T20:55:49.000”,
“启动区域中的位置”:真,
“结束位置在区域中”:正确,
“期限”:30000
},
{
“开始日期”:“2020-10-07T21:53:26.000”,
“结束日期”:“2020-10-07T22:55:49.000”,
“启动区域中的位置”:false,
“结束位置在区域中”:false,
“持续时间”:4200
},
{
“开始日期”:“2020-10-07T23:53:26.000”,
“结束日期”:“2020-10-08T00:00:49.000”,
“启动区域中的位置”:false,
“结束位置在区域中”:false,
“持续时间”:4200
}
]
结果:
[{
“开始日期”:“2020-10-07T13:53:26.000”,
“结束日期”:“2020-10-07T14:55:49.000”,
“州”:“外区”,
“期限”:143000,
“开始索引”:“0”,
“结束索引”:“0”
},
{
“开始日期”:“2020-10-07T15:53:26.000”,
“结束日期”:“2020-10-07T16:55:49.000”,
“州”:“至区域”,
“持续时间”:7000,
“开始索引”:“1”,
“结束索引”:“1”
},
{
“开始日期”:“2020-10-07T17:53:26.000”,
“结束日期”:“2020-10-07T19:55:49.000”,
“州”:“在区内”,
“期限”:50000,
“开始索引”:“2”,
“结束索引”:“3”
},
{
“开始日期”:“2020-10-07T21:53:26.000”,
“结束日期”:“2020-10-08T00:10:49.000”,
“州”:“外区”,
“持续时间”:8400,
“开始索引”:“4”,
“结束索引”:“5”
}
]
减少成本的好例子
const数据=[
{
“开始日期”:“2020-10-07T13:53:26.000”,
“结束日期”:“2020-10-07T14:55:49.000”,
“启动区域中的位置”:false,
“结束位置在区域中”:false,
“持续时间”:143000
},
{
“开始日期”:“2020-10-07T15:53:26.000”,
“结束日期”:“2020-10-07T16:55:49.000”,
“启动区域中的位置”:false,
“结束位置在区域中”:正确,
“持续时间”:7000
},
{
“开始日期”:“2020-10-07T17:53:26.000”,
“结束日期”:“2020-10-07T18:55:49.000”,
“启动区域中的位置”:真,
“结束位置在区域中”:正确,
“持续时间”:20000
},
{
“开始日期”:“2020-10-07T19:53:26.000”,
“结束日期”:“2020-10-07T20:55:49.000”,
“启动区域中的位置”:真,
“结束位置在区域中”:正确,
“期限”:30000
},
{
“开始日期”:“2020-10-07T21:53:26.000”,
“结束日期”:“2020-10-07T22:55:49.000”,
“启动区域中的位置”:false,
“结束位置在区域中”:false,
“持续时间”:4200
},
{
“开始日期”:“2020-10-07T23:53:26.000”,
“结束日期”:“2020-10-08T00:00:49.000”,
“启动区域中的位置”:false,
“结束位置在区域中”:false,
“持续时间”:4200
},
{
“开始日期”:“2020-10-08T00:00:49.000”,
“结束日期”:“2020-10-08T00:00:50.000”,
“启动区域中的位置”:false,
“结束位置在区域中”:false,
“持续时间”:1
},
{
“开始日期”:“2020-10-08T00:00:50.000”,
“结束日期”:“2020-10-08T00:00:51.000”,
“启动区域中的位置”:false,
“结束位置在区域中”:false,
“持续时间”:2
},
{
“开始日期”:“2020-10-08T00:00:51.000”,
“结束日期”:“2020-10-08T00:00:52.000”,
“启动区域中的位置”:false,
“结束位置在区域中”:正确,
“持续时间”:12
}
]
让前一个=未定义
让mergedData=data.reduce((acc,cur,i)=>{
cur.start_index=i
cur.end_index=i
如果(!上一个){
前一个=当前
返回acc
}
让isStartInZone=previous.start\u location\u in_zone===previous.end\u location\u in_zone
设isEndNotInZone=cur.start\u location\u in_zone===cur.end\u location\u in_zone
let shouldMerge=isStartInZone&&isEndNotInZone&&previous.start\u location\u in_zone===cur.start\u location\u in_zone
如果(应该合并){
previous.end_date=cur.end_date
上一个持续时间+=当前持续时间
previous.end_index=i
//附件推送(上一个)
//先前=未定义
返回acc
}
附件推送(上一个)
前一个=当前
返回acc
}, [])
//如果最后一个元素未合并,则处理剩余部分
如果(上一个)合并数据推送(上一个)
console.log(mergedData)
@pilchard是的,不清楚。你要给我们看吗