在AngularJS中添加momentJS对象时出现问题

时间:2014-11-12 15:43:27

标签: javascript angularjs momentjs

我有一个看起来像这样的对象:

var carsDict = { 
391: [
    {
     arrival: "17.43.49",
     car: "391",
     date: "11/11/2014",
     duration: "00:00:06",
     time: "17.43.43"
    }
],

396: {
    0: {
     arrival: "17.20.48",
     car: "396",
     date: "11/11/2014",
     duration: "00:00:11",
     time: "17.20.37",
    },        
    1: {
     arrival: "17.21.27",
     car: "396",
     date: "11/11/2014",
     duration: "00:00:17",
     time: "17.21.10"
    }
}
};

duration属性是由以下行构成的MomentJS对象:

record.duration = moment.utc(moment(record.arrival,'HH:mm:ss')
                  .diff(moment(record.time,'HH:mm:ss'))).format("HH:mm:ss");

下一步是将每个阵列中的所有持续时间对象添加到一起。我可以使用下面的代码来做到这一点:

for (record in carsDict) {     
  var totalduration = '';

  for (item in carsDict[record]) {
    // get totalduration figured out..
    totalduration += moment.utc(carsDict[record][item].duration, 'HH:mm:ss');
  }

  for (item in carsDict[record]) {
    // now add totalduration to each record        
    carsDict[record][item]['totalduration'] = totalduration; 
  }
};

鉴于上面的示例,第一个数组的totalduration应为"00:00:06",第二个"00:00:28" {" 00:00:11" +&# 34; 00:00:17"),但我得到了其他结果,第一个是1415750406000,第二个是14157504110001415750417000。

我认为错误在这一行,但我无法确切地知道为什么不正确添加moment()对象。

totalduration += moment.utc(carsDict[record][item].duration, 'HH:mm:ss');

这里是JSFiddle

关于我做错了什么的任何想法?

1 个答案:

答案 0 :(得分:1)

你的问题实际上并不在你想到的那一行,而是在这两行中:

var totalduration = '';
totalduration += moment.utc(carsDict[record][item].duration, 'HH:mm:ss');

您从字符串开始并向其添加时刻/日期对象。如果将+与字符串和任何其他对象一起使用,它将首先将该另一个对象转换为基元,然后转换为字符串,然后连接两者:

"1" + 0 === "10"

所以你得到的结果是由于当时对象首次转换为基元 - 在这种情况下是一个数字(你可以通过调用当前对象上的valueOf来确认) - 然后是一个字符串代表这个数字。

您需要做的是计算总时差(以毫秒为单位),因此请从数字开始:

var totalduration = 0;

并在添加之前将moment对象转换为数字:

totalduration += Number(moment.utc(carsDict[record][item].duration, 'HH:mm:ss'));

然后使用时刻解析这个数字(这是一个Unix时间戳,或以毫秒为单位的总和)并在设置时格式化它:

carsDict[record][item]['totalduration'] = moment.utc(totalduration).format('HH:mm:ss');