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

Javascript 如何对给定日期范围内的值求和,javascript,arrays,sorting,polymer,local-storage,Javascript,Arrays,Sorting,Polymer,Local Storage,我正在使用LocalStorage来保存一系列日期和成本。 当我编写localStorage.getItem(“todos”)时进入控制台,格式如下: "[{"due":"28/10/2017","task":"80"},{"due":"06/10/2017","task":"15"}]" 其中到期日是日期,任务是金额 我通过以下方式获得了总金额: total: { type: String, value: () => { var values = localStorag

我正在使用LocalStorage来保存一系列日期和成本。 当我编写
localStorage.getItem(“todos”)时进入控制台,格式如下:

"[{"due":"28/10/2017","task":"80"},{"due":"06/10/2017","task":"15"}]"
其中到期日是日期,任务是金额

我通过以下方式获得了总金额:

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个月的总数。 我不知道该怎么做。
我应该如何做到这一点?

在迭代过程中,您需要添加一个检查,以确保总和仅包括到期日在您范围内的值。如果您可以使用像
moment
这样的库,这将大大简化您的逻辑

const数据=[
{截止日期:2017年10月28日,任务:80},
{截止日期:2017年10月6日,任务:15},
{截止日期:2000年5月10日,任务:3000}
];
const sixMonthsAgo=矩().减去(6,'月');
常量合计=数据减少((acc,项目)=>{
const dueDate=时刻(项目到期日,'DD/MM/YYYY');
返回acc+(dueDate.isAfter(六个月前)?item.task:0);
}, 0);
log('总计应等于95:',总计)

在迭代过程中,您需要添加一个检查,以确保总和仅包括到期日在您范围内的值。如果您可以使用像
moment
这样的库,这将大大简化您的逻辑

const数据=[
{截止日期:2017年10月28日,任务:80},
{截止日期:2017年10月6日,任务:15},
{截止日期:2000年5月10日,任务:3000}
];
const sixMonthsAgo=矩().减去(6,'月');
常量合计=数据减少((acc,项目)=>{
const dueDate=时刻(项目到期日,'DD/MM/YYYY');
返回acc+(dueDate.isAfter(六个月前)?item.task:0);
}, 0);
log('总计应等于95:',总计)

以下是针对您的问题的解决方案: 在forEach循环中进行测试: 我已经安排了4次约会:2次在6个月以下,2次在6个月以上 结果是80+15=95

//在JSON.parse之后
var todos=[{“到期”:“2017年10月28日”,“任务”:“80”},{“到期”:“2017年10月6日”,“任务”:“15”},{“到期”:“2017年4月6日”,“任务”:“15”},{“到期”:“2017年2月6日”,“任务”:“15”});
var总和=0;
var minDate=新日期();
var month=minDate.getMonth()+1-6;//得到一个月减去6个月
var year=minDate.getFullYear();//获得年份
如果(月<1){//如果月低于1月,则更改年份
月+=6;
年份-=1;
}
minDate.setMonth(月);//将我们的最小日期替换为-6 m
minDate.setYear(年);//设定年份,以防我们发生变化
todos.forEach(函数(ele){
var arr=ele.due.split(“/”)//将法语字符串日期拆分为d、m、y
如果(arr.length==3){
var dueDate=新日期(arr[2],arr[1],arr[0]);//获取任务日期
如果(dueDate>minDate){//如果任务不是旧的,那么
sum+=parseInt(ele.task);//求和
}
}
});

控制台日志(总和)以下是针对您的问题的解决方案: 在forEach循环中进行测试: 我已经安排了4次约会:2次在6个月以下,2次在6个月以上 结果是80+15=95

//在JSON.parse之后
var todos=[{“到期”:“2017年10月28日”,“任务”:“80”},{“到期”:“2017年10月6日”,“任务”:“15”},{“到期”:“2017年4月6日”,“任务”:“15”},{“到期”:“2017年2月6日”,“任务”:“15”});
var总和=0;
var minDate=新日期();
var month=minDate.getMonth()+1-6;//得到一个月减去6个月
var year=minDate.getFullYear();//获得年份
如果(月<1){//如果月低于1月,则更改年份
月+=6;
年份-=1;
}
minDate.setMonth(月);//将我们的最小日期替换为-6 m
minDate.setYear(年);//设定年份,以防我们发生变化
todos.forEach(函数(ele){
var arr=ele.due.split(“/”)//将法语字符串日期拆分为d、m、y
如果(arr.length==3){
var dueDate=新日期(arr[2],arr[1],arr[0]);//获取任务日期
如果(dueDate>minDate){//如果任务不是旧的,那么
sum+=parseInt(ele.task);//求和
}
}
});

控制台日志(总和)你好!非常感谢您的回复!您的示例很有魅力,但当我尝试设置var todos=localStorage.getItem(“todos”)时,它给了我一个错误:Uncaught TypeError:todos.forEach不是函数。我认为我没有正确阅读列表?forEach在数组上工作,请小心将其与数组一起使用。解析你的JSON?你好!非常感谢您的回复!您的示例很有魅力,但当我尝试设置var todos=localStorage.getItem(“todos”)时,它给了我一个错误:Uncaught TypeError:todos.forEach不是函数。我认为我没有正确阅读列表?forEach在数组上工作,请小心将其与数组一起使用。解析你的JSON?非常感谢你的回复!在您提供的示例中,它起到了吸引人的作用,但是,当我试图用localStorage.getItem(“todos”)替换您提供的日期时,我遇到了一个错误:(您是否像在示例中那样解析localStorage中的数据?谢谢!这就是问题所在。您能告诉我,为了更好地理解此类内容,我应该阅读更多的内容吗?再次感谢!@unkn0wnx这只需要时间和经验-熟悉您使用的语言。@chazsolo我问了一个关于求和数字您能看到我的问题并给我一些想法吗?这是我的问题,非常感谢您的回答!您提供的示例很有吸引力,但是,当我试图用localStorage.getItem(“todos”)替换您提供的日期时,我遇到了一个错误:(您是否像在示例中那样解析localStorage中的数据?谢谢!这就是问题所在。您能告诉我,为了更好地理解此类内容,我应该阅读更多的内容吗?再次感谢!@unkn0wnx这只需要时间和经验-熟悉您使用的语言。@chazsolo我问了一个关于你能看到我的问题并给我一些想法吗?这是我的问题