【问题标题】:How to sum values over a given date range如何对给定日期范围内的值求和
【发布时间】:2018-03-31 12:17:37
【问题描述】:

我正在使用 LocalStorage 来保存一组日期和成本。 当我将localStorage.getItem("todos"); 写入控制台时,格式将是这样的:

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

due 是 Date,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 个月的总数。 我不知道如何解决这个问题。 我应该如何做到这一点?

【问题讨论】:

    标签: javascript arrays sorting polymer local-storage


    【解决方案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);

    【讨论】:

    • 您好!非常感谢您的回复!您的示例就像一个魅力,但是,当我尝试设置 var todos = localStorage.getItem("todos") 时,它给了我一个错误:Uncaught TypeError: todos.forEach is not a function。我认为我没有正确阅读列表?
    • forEach 适用于数组,小心与数组一起使用。滴滴你 JSON.parse 你的 json 吗?
    【解决方案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);
    &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.19.1/moment.min.js"&gt;&lt;/script&gt;

    【讨论】:

    • 非常感谢您的回复!它与您提供的示例一样具有魅力,但是,当我尝试用 localStorage.getItem("todos") 替换您提供的日期时,出现错误:(
    • 您是否像在示例中那样解析了 localStorage 中的数据?
    • 谢谢!这就是问题所在。你能告诉我为了更好地理解这些事情,我应该阅读更多内容吗?再次感谢!
    • @unkn0wnx 这需要时间和经验 - 熟悉您使用的语言。
    • @chazsolo 我问了一个关于数字求和的问题,你能看到我的问题并给我任何想法吗?这是我的问题stackoverflow.com/questions/49975361/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-29
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多