我有以下简化(javascript)对象,其中属性是日期(在字符串fomat中):
给定对象中日期范围内的随机startdate和enddate,如何编码(有效)计算 - 比如说在这个范围内积累的值?例如,对于以下代码,给定的startdate和enddate的计算结果应为12(3 + 4 + 5)。
var startdate = '2014-01-03';
var enddate = '2014-01-05'
var obj = {};
obj['2014-01-02'] = '2';
obj['2014-01-03'] = '3';
obj['2014-01-04'] = '4';
obj['2014-01-05'] = '5';
obj['2014-01-06'] = '6';
答案 0 :(得分:0)
您可以循环浏览对象的属性,进行比较,然后添加。
var startdate = '2014-01-04';
var enddate = '2014-01-05';
var arr = {};
arr['2014-01-02'] = '2';
arr['2014-01-03'] = '3';
arr['2014-01-04'] = '4';
arr['2014-01-05'] = '5';
arr['2014-01-06'] = '6';
var total = 0;
for(var p in arr) {
if(arr.hasOwnProperty(p)) {
if(new Date(p) >= new Date(startdate) && new Date(p) <= new Date(enddate)) {
total += parseInt(arr[p], 10);
}
}
}
console.log(total);
示例http://jsbin.com/imUdewaJ/1/edit
我确信有更好的方法可以做到这一点,但我不知道如何解析日期对象以进行比较。
- 在下面的评论
中的hasOwnProperty检查中添加了编辑答案 1 :(得分:0)
有可能是some browsers won't support date1 > date2
,因此最好也使用getTime()
。
function getDate(date) {
return new Date(date).getTime();
}
function getTotal(start, end) {
var total = 0;
for (var k in obj) {
var current = getDate(k);
if (current >= start && current <= end) {
total += parseInt(obj[k], 10);
}
}
return total;
}
var start = getDate(startdate);
var end = getDate(enddate);
console.log(getTotal(start, end)); // 12
答案 2 :(得分:0)
在处理日期时,您可能希望使用第三方工具来处理浏览器兼容性。 Momentjs对于约会是一个很好的。
momentjs的解决方案:
var startdate = moment('2014-01-03');
var enddate = moment('2014-01-05');
var obj = {};
obj['2014-01-02'] = '2';
obj['2014-01-03'] = '3';
obj['2014-01-04'] = '4';
obj['2014-01-05'] = '5';
obj['2014-01-06'] = '6';
var strDate;
var total = 0;
for (strDate in obj) {
if (obj.hasOwnProperty(strDate)) {
var date = moment(strDate)
if (date.diff(startdate, 'days')>=0 && date.diff(enddate, 'days')<=0) {
total += parseInt(obj[strDate], 10);
}
}
}
console.log(total);