计算总时间

时间:2013-03-10 07:02:46

标签: javascript arrays json

我有一些json数据,每天包含不同的时间。我必须根据日计算时间总和。这是我的JSON

   [
    {
        "id":"1",
        "monday_NT":"3:45",
        "monday_TH":"2:45",
        "monday_DT":"4:45",
        "monday_DTH":"2:45",
    },
    {
        "id":"2",
        "monday_NT":"2:45",
        "monday_TH":"5:45",
        "monday_DT":"3:45",
        "monday_DTH":"1:49",
    }
]

我已经完成了这个计算,但是我为这个计算使用了太多变量。这是我星期一的代码:

var monday_NT_hr=0;
var monday_TH_hr=0;
var monday_DT_hr=0;
var monday_DTH_hr=0;
var monday_NT_min=0;
var monday_TH_min=0;
var monday_DT_min=0;
var monday_DTH_min=0;
for(var i=0;i<data.length;i++)
{
    for(var index in data[i])
    {
        if(index=="monday_NT")
        {
            monday_NT_hr +=data[i][index].split(":")[0]; 
            monday_NT_min +=data[i][index].split(":")[1];
        }
        if(index=="monday_TH")
        {
            monday_TH_hr +=data[i][index].split(":")[0];
            monday_TH_min +=data[i][index].split(":")[1];
        }
        if(index=="monday_DT")
        {
            monday_DT_hr +=data[i][index].split(":")[0];
            monday_DT_min +=data[i][index].split(":")[1];
        }
        if(index=="monday_DTH")
        {
            monday_DTH_hr +=data[i][index].split(":")[0];
            monday_DTH_min +=data[i][index].split(":")[1];
        }
    }
}

是否有这么少的变量用于此计算? 请帮忙。

4 个答案:

答案 0 :(得分:1)

如果我可以假设列出的每个值都是以小时和分钟为单位的时间,并且您希望找到所有时间的总和,则可以合并代码。

var total_time = 0;

for (var i = 0; i < data.length; i++) {
  for (var attr in data[i]) {
    if (attr != 'id') {
      total_time += getSeconds(data[i][attr]);
    }
  }
}

total_time = secToFormatted(total_time); // Total time in a formatted string

function getSeconds(strTime) {
  // Convert a string time to seconds
}

function secToFormatted(seconds) {
  // Convert seconds into hours and minutes string
}

答案 1 :(得分:0)

您只需设置两个名为hoursminutes的对象,并根据原始数据中的确切密钥名称添加总和:

var hours = {},
    minutes = {};

for (var i = 0, il = data.length; i < il; i++) {
    for (var k in data[i]) {
        var timeSplit = data[i][k].split(':'),
            hour = parseInt(timeSplit[0], 10),
            min = parseInt(timeSplit[1], 10);

        hours[k] = hours[k] ? hours[k] + hour : hour;
        minutes[k] = minutes[k] ? minutes[k] + min : min;
    }
}

console.log(hours);
// {id: 3, monday_NT: 5, monday_TH: 7, monday_DT: 7, monday_DTH: 3}
console.log(minutes);
// {id: NaN, monday_NT: 90, monday_TH: 90, monday_DT: 90, monday_DTH: 94}

您可以忽略id

See Demo

答案 2 :(得分:0)

这应该好多了:(fiddle

var monday_NT= {min:0, hr:0};
var monday_TH={min:0, hr:0};
var monday_DT={min:0, hr:0};
var monday_DTH={min:0, hr:0};

function splitSum(obj, data) {  
    data = data.split(":");
    obj.hr += Number(data[0]);
    obj.min += Number(data[1]); 
}

for(var i in arr) {    
    splitSum(monday_NT, arr[i].monday_NT);
    splitSum(monday_TH, arr[i].monday_TH);
    splitSum(monday_DT, arr[i].monday_DT);
    splitSum(monday_DTH, arr[i].monday_DTH);
}

根据你的例子

monday_NT.min

等同于

monday_NT_min

虽然我相信所有这些艰苦的工作都没有带来额外的好处。

答案 3 :(得分:0)

如果你想在24hr formate中计算两次的时差

var time1 = "22:00"
var time2 = "01:00"

答案:3:00小时

var c = a.split(":")
var d = b.split(":")
var aH = parseInt(c[0])
var aM = parseInt(c[1])
var bH = parseInt(d[0])
var bM = parseInt(d[1])


if(aM > bH) {
 bH -= 1
 bM += 60
}
if(aH > bH) {
    bH += 24
}
var hour = bH - aH
var min = bM - aM
console.log( hour + ":" + min)

See Demo