以下代码在遍历数组时使用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'])