如何对给定日期范围内的值求和

时间:2017-10-19 12:47:07

标签: javascript arrays sorting polymer local-storage

我使用LocalStorage来保存日期和费用数组。 当我将localStorage.getItem("todos");写入控制台时,格式如下:

"[{"due":"28/10/2017","task":"80"},{"due":"06/10/2017","task":"15"}]"

到期日为什么,而TASK为AMOUNT。

我设法通过以下方式获得了总数:

total: {
  type: String,
  value: () => {
    var values = localStorage.getItem("todos");
    if (values === undefined || values === null) {
      return "0";
    }
    var data = JSON.parse(values);
    var sum = 0;
    data.forEach(function(ele){ sum+=Number(ele.task)}); return sum;
  }
}

现在我试图获得过去6个月的总计。 我不知道如何处理这个问题。 我怎么能这样做?

2 个答案:

答案 0 :(得分:2)

在迭代期间,您需要添加一项检查,以确保总和仅包含截止日期在您的范围内的值。如果您可以使用像moment这样的库,这将大大简化您的逻辑。

const data = [
  { due: '28/10/2017', task: 80 },
  { due: '06/10/2017', task: 15 },
  { due: '10/05/2000', task: 3000 }
];

const sixMonthsAgo = moment().subtract(6, 'months');

const total = data.reduce((acc, item) => {
  const dueDate = moment(item.due, 'DD/MM/YYYY');
  return acc + (dueDate.isAfter(sixMonthsAgo) ? item.task : 0);
}, 0);

console.log('total should equal 95: ', total);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.19.1/moment.min.js"></script>

答案 1 :(得分:1)

以下是您的问题的解决方案: 在forEach循环中进行测试: 我提出了4个日期:2个月不到6个月,2个年龄 结果是80 + 15 = 95

// After JSON.parse
var todos=[{"due":"28/10/2017","task":"80"},{"due":"06/10/2017","task":"15"},{"due":"06/04/2017","task":"15"},{"due":"06/02/2017","task":"15"}];
var sum = 0;
	var minDate = new Date();
	var month = minDate.getMonth()+1-6; // get month minus 6 months
	var year = minDate.getFullYear(); // get year
	if(month < 1){ // if month is under January then change year
		month+=6;
		year-= 1;
	}
	minDate.setMonth(month); // Replace our min date with our - 6 m
	minDate.setYear(year); // set year in case we have changed

todos.forEach(function(ele){
	var arr = ele.due.split("/"); // split french string date into d,m,y
	if(arr.length==3){
		var dueDate = new Date(arr[2],arr[1],arr[0]); // get the task date
		if(dueDate>minDate){ // if task is not to old then
			sum+=parseInt(ele.task); // sum it

		}
	}
});
console.log(sum);