我有一个像这样的数组,
[
{id: 1, name: "sleep", endTime: 1600261550535, startTime: 1600261541729}, // 9 sec
{id: 2, name: "sleep", endTime: 1600261527833, startTime: 1600261522709}, // 5 sec
{id: 3, name: "sleep", endTime: 1600261496881, startTime: 1600261437616}, // 59 sec
{id: 4, name: "awake", endTime: 1600261427129, startTime: 1600261413596}, // 14 sec
{id: 5, name: "awake", endTime: 1600261403114, startTime: 1600261347569}, // 56 sec
{id: 6, name: "awake", endTime: 1600261337893, startTime: 1600261206497}, // 2 min 11 sec
]
当所有具有相同name
的对象加在一起时,我需要计算总时间(持续时间)。时间格式应为hr,min,sec。
显然,一次获取其中一个的持续时间很容易,但是我想不出一种加在一起的持续时间的方法。
非常感谢您的帮助。谢谢。随时使用一下时刻或lodash
输出应为
total duration sleep : 1 min 13 secs
total duration awake : 3 min 21 secs
编辑:非常感谢您的答复,你们是使社区变得更好的原因。
答案 0 :(得分:1)
let sleepResult = 0;
let awakeResult = 0;
array.forEach(item => {
const diff = item.endTime - item.startTime
if (item.name === 'sleep')
sleepResult += diff
if (item.name === 'awake')
awakeResult += diff
})
console.log(`total duration sleep : ${sleepResult}`)
console.log(`total duration awake : ${awakeResult}`)
这将使您实现要求的条件。
假设您将最终日志的格式设置为
1分13秒
由于sleepResult
和awakeResult
是时间戳记
答案 1 :(得分:1)
这对我有用:
someone.name@g
答案 2 :(得分:1)
您可以使用Map
将基于name
的对象累积到reduce中。完成累加/求和后,可以在地图上使用Array.from并带有映射功能,以将地图的值转换为所需的格式。然后,您可以for / Each /循环遍历地图项并打印出键/值:
const arr = [ {id: 1, name: "sleep", endTime: 1600261550535, startTime: 1600261541729}, {id: 2, name: "sleep", endTime: 1600261527833, startTime: 1600261522709}, {id: 3, name: "sleep", endTime: 1600261496881, startTime: 1600261437616}, {id: 4, name: "awake", endTime: 1600261427129, startTime: 1600261413596}, {id: 5, name: "awake", endTime: 1600261403114, startTime: 1600261347569}, {id: 6, name: "awake", endTime: 1600261337893, startTime: 1600261206497}];
const ppTime = s => {
const hours = Math.floor(s / 3600);
const min = Math.floor(s / 60) % 60
const secs = s % 60;
return [[hours, 'hours'], [min, 'min'], [secs, 'secs']].filter(([f]) => f).map(arr => arr.join(' ')).join(' ');
}
const res = Array.from(arr.reduce((m, {name, endTime, startTime}) => {
return m.set(name, (m.get(name) || 0) + (endTime - startTime));
}, new Map), ([k, v]) => [k, ppTime(Math.round(v/1000))]);
res.forEach(([name, time]) => {
console.log(`total duration ${name} : ${time}`);
});
答案 3 :(得分:1)
尝试一下:
var timeStamps = [
{id: 1, name: "sleep", endTime: 1600261550535, startTime: 1600261541729}, // 9 sec
{id: 2, name: "sleep", endTime: 1600261527833, startTime: 1600261522709}, // 5 sec
{id: 3, name: "sleep", endTime: 1600261496881, startTime: 1600261437616}, // 59 sec
{id: 4, name: "awake", endTime: 1600261427129, startTime: 1600261413596}, // 14 sec
{id: 5, name: "awake", endTime: 1600261403114, startTime: 1600261347569}, // 56 sec
{id: 6, name: "awake", endTime: 1600261337893, startTime: 1600261206497}, // 2 min 11 sec
];
var sleep = 0;
var awake = 0;
timeStamps.forEach((element) => {
if(element.name == "sleep") {
sleep = sleep + element.endTime-element.startTime;}
if(element.name == "awake") {
awake = awake + element.endTime-element.startTime;}});
var date = new Date(sleep);
var date1 = new Date(awake);
var sleepMinutes = date.getMinutes();
var sleepSeconds = date.getSeconds();
var awakeMinutes = date1.getMinutes();
var awakeSeconds = date1.getSeconds();
console.log("total amount of sleep: %s min %s sec",sleepMinutes, sleepSeconds);
console.log("total amount of awake: %s min %s sec",awakeMinutes, awakeSeconds);
答案 4 :(得分:1)
这是一个有趣的代码挑战。我希望它可以帮助您实现最终目标。
const getSleepAndDuration = (array) => {
const finalTimesInSeconds = array.reduce(
(accum, current) => {
const start = moment(current.startTime);
const end = moment(current.endTime);
const diffInSeconds = end.diff(start, "seconds");
accum[current.name] += diffInSeconds;
return accum;
},
{
sleep: 0,
awake: 0,
}
);
const { sleep, awake } = finalTimesInSeconds;
const sleepText = getDurationText(sleep);
const awakeText = getDurationText(awake);
console.log(`total duration sleep: ${sleepText}`);
console.log(`total duration awake: ${awakeText}`);
};
const getDurationText = (duration) => {
const days = Math.floor(duration / 86400);
const hours = Math.floor((duration - days * 86400) / 3600);
const minutes = Math.floor((duration - days * 86400 - hours * 3600) / 60);
const seconds = Math.floor(
duration - days * 86400 - hours * 3600 - minutes * 60
);
let time = "";
if (days) {
time += `${days} ${days === 1 ? "day" : "days"}`;
}
if (hours) {
time += ` ${hours} ${hours === 1 ? "hour" : "hours"}`;
}
if (minutes) {
time += ` ${minutes} ${minutes === 1 ? "minute" : "minutes"}`;
}
if (seconds) {
time += ` ${seconds} ${seconds === 1 ? "second" : "seconds"}`;
}
return time;
};