使用Array.reduce计算时差



以下代码在遍历数组时使用array.reduce返回开始和停止之间的时间差。

正如您所看到的,它是非常基本的,不考虑事件和任务等。

let data = [
{
action: "start",
time: 100
},
{
action: "stop",
time: 150
}, 
{
action: "start",
time: 250
}, 
{
action: "stop",
time: 350
}, 
{
action: "start",
time: 400
}
];
let end = 450; // should be Date.now(),
let sum = data.reduce(function (r, a) {
return r + (a.action === 'start' ? -a.time : a.time);
}, data[data.length - 1].action === 'start' ? end : 0);
console.log(sum);

我想象这个数据阵列的可扩展版本是这样的:

let data = [
{
activity: "JOB",
event: "CLOCK IN",
task: "TRAVEL",
desc: "Job #12345",
time: 100
},
{
activity: "JOB",
event: "CLOCK IN",
task: "ON SITE",
desc: "Job #12345",
time: 150
}, 
{
activity: "JOB",
event: "CLOCK IN",
task: "BREAK",
desc: "Job #12345",
time: 250
}, 
{
activity: "JOB",
event: "CLOCK IN",
task: "ON SITE",
desc: "Job #12345",
time: 350
}, 
{
activity: "JOB",
event: "CLOCK OUT",
task: "HOME",
desc: "Job #12345",
time: 450
}
];

到目前为止,Array.reduce的学习有点困难。如有任何帮助,我们将不胜感激。

如何修改此代码以遍历可伸缩数组?

如果您的数据最终将包含多个作业的CLOCK IN和CLOCK OUT事件流,一个更好的例子可能如下:

const data = [
{
activity: "JOB",
event: "CLOCK IN",
task: "TRAVEL",
desc: "Job #1",
time: 100
},
{
activity: "JOB",
event: "CLOCK OUT",
task: "ON SITE",
desc: "Job #1",
time: 150
}, 
{
activity: "JOB",
event: "CLOCK IN",
task: "BREAK",
desc: "Job #2",
time: 250
}, 
{
activity: "JOB",
event: "CLOCK OUT",
task: "ON SITE",
desc: "Job #2",
time: 350
}, 
{
activity: "JOB",
event: "CLOCK IN",
task: "HOME",
desc: "Job #3",
time: 450
},
{
activity: "JOB",
event: "CLOCK OUT",
task: "HOME",
desc: "Job #3",
time: 500
}
];

它显示了三个离散作业的CLOCK IN和CLOCK OUT事件:作业#1、作业#2和作业#3。

如果我是对的,那么下面的代码应该会给你所需要的:

const jobs = data.reduce((prev,event)=>({
...prev,
[event.desc]:{
...prev[event.desc],
[event.event]:event.time
}
}),{})

它将数据转换为如下对象:

{
'Job #1': { 'CLOCK IN': 100, 'CLOCK OUT': 150 },
'Job #2': { 'CLOCK IN': 250, 'CLOCK OUT': 350 },
'Job #3': { 'CLOCK IN': 450, 'CLOCK OUT': 500 }
}

然后,我们可以用以下内容来丰富该对象中的每个作业项目的持续时间:

const result = Object.entries(jobs).reduce((prev,entry)=>{
const [key,value] = entry
return ({
...prev,
[key]:{
...value,
DURATION: value['CLOCK OUT'] - value['CLOCK IN']
}
})
}
,{})

结果是:

{
'Job #1': {
'CLOCK IN': 100,
'CLOCK OUT': 150,
DURATION: 50
},
'Job #2': {
'CLOCK IN': 250,
'CLOCK OUT': 350,
DURATION: 100
},
'Job #3': {
'CLOCK IN': 450,
'CLOCK OUT': 500,
DURATION: 50
}
}

怎么样?

下面的工作示例:

const data = [
{
activity: "JOB",
event: "CLOCK IN",
task: "TRAVEL",
desc: "Job #1",
time: 100
},
{
activity: "JOB",
event: "CLOCK OUT",
task: "ON SITE",
desc: "Job #1",
time: 150
}, 
{
activity: "JOB",
event: "CLOCK IN",
task: "BREAK",
desc: "Job #2",
time: 250
}, 
{
activity: "JOB",
event: "CLOCK OUT",
task: "ON SITE",
desc: "Job #2",
time: 350
}, 
{
activity: "JOB",
event: "CLOCK IN",
task: "HOME",
desc: "Job #3",
time: 450
},
{
activity: "JOB",
event: "CLOCK OUT",
task: "HOME",
desc: "Job #3",
time: 500
}
];
const jobs = data.reduce((prev,event)=>({
...prev,
[event.desc]:{
...prev[event.desc],
[event.event]:event.time
}
}),{});
const result = Object.entries(jobs).reduce((prev,entry)=>{
const [key,value] = entry
return ({
...prev,
[key]:{
...value,
DURATION: value['CLOCK OUT'] - value['CLOCK IN']
}
})
}
,{});
console.log(result);

如果我知道您需要两个函数isStartType()isStopType()。它们都只是一个switch case返回值。或者,如果您确信不会得到意外类型,则只需要1个函数isStartType()。然后将这个a.action === 'start'修改为isStartType(a['propertyName'])

最新更新