【问题标题】:Get all records from an array for the last month in YYYY-MM-DD format以 YYYY-MM-DD 格式从数组中获取上个月的所有记录
【发布时间】:2020-03-18 18:43:21
【问题描述】:

如何找到数组[{value:"String", date:"YYYY-MM-DD"}] 中的所有对象以及最后提供的月份和年份?年份范围是2018-2020。我想要一些东西而不是切片和相等。

例如,我得到:50 个包含值和日期属性的项目数组。 值是字符串格式的简单价格,日期如“2020-02-12”、“2019-12-13”、“2019-04-28”等。所以我需要获取上个月的所有值并将它们相加。所以问题出在上个月的发现中。数组是动态的,这意味着我得到了大约 300 个数组的变体,因此上个月和上年的结果每次都可能不同。

【问题讨论】:

  • 您可以将字符串中的值转换为Date,然后在数组中使用.filter()就可以了。
  • @norbitrial 很有趣,我要去看看。
  • 用适当的例子和预期的输出重新排列你的问题。这将帮助您获得快速响应。

标签: javascript arrays date


【解决方案1】:

正如我在评论部分提到的,您可以使用new Date() 转换每个具有日期值的字符串,然后在数组上使用.filter() 就可以了。

请看下面的例子:

const data = [{value: 'val3', date: '2017-05-06'},{value: 'val2', date: '2018-05-06'},{value: 'val1', date: '1988-05-06'},{value: 'val4', date: '2019-03-22'},{value: 'val6', date: '2019-12-24'}];

const result = data.filter(e =>
                                new Date('2018-01-01') < new Date(e.date) &&
                                new Date(e.date) < new Date('2020-01-01')
                          );

console.log(result);

我希望这会有所帮助!

【讨论】:

    【解决方案2】:

    据我了解,您需要上个月所有值的总和。我认为下面的代码是你需要的:

    let data = [{value: '43.21', date: '2019-07-06'},{value: '24.34', date: '2017-03-03'},{value: '54.32', date: '2020-02-03'},{value: '11.32', date: '2020-02-05'},{value: '34.23', date: '2019-11-21'},{value: '32.34', date: '2020-01-24'},{value: '32.34', date: '2020-02-21'}];
    
    //find last newest record to get it's date
    let lastdate=new Date(data.reduce(function (a, b) { return a.date > b.date ? a : b; }).date);
    
    
    let result = data.reduce(function(sum, e){
    			return (isNaN(parseFloat(sum))?0:parseFloat(sum))+(new Date(lastdate.getFullYear(), lastdate.getMonth(), 1) < new Date(e.date) && new Date(e.date) <= new Date(lastdate.getFullYear(), lastdate.getMonth() + 1, 0)?parseFloat(e.value):0) });
    
    document.write("last year/month: " + lastdate.getFullYear()+"/"+(lastdate.getMonth()+1));
    document.write("<br>result: "+ result);

    【讨论】:

    • YYYY-MM-DD 格式的日期被解析为 UTC,因此您应该使用所有 UTC 方法。仅代码的答案没有那么有用,您应该解释为什么 OP 有问题以及您的代码如何修复它。
    【解决方案3】:

    给定 YYYY-MM-DD 的日期格式,这些值将按词法排序和比较。所以首先找到上个月,然后过滤该月的日期,例如

    let data = [
      {a:'a', date:'2020-02-12'},
      {a:'a', date:'2019-12-13'},
      {a:'a', date:'2019-04-28'},
      {a:'a', date:'2019-12-15'},
      {a:'a', date:'2020-02-28'},
      {a:'a', date:'2018-12-13'}]; 
    
    // Get last date
    let last = data.map(obj => obj.date).sort()[data.length-1];
    console.log(last);
    
    // Get objects in last month
    let lastMonthsValues = data.filter(
      obj => obj.date.substr(0,7) == last.substr(0,7)
    );
    
    // Last month's objects
    console.log(lastMonthsValues);

    您可以使用 Date 对象做同样的事情,但这需要首先解析为 Date,然后使用 date.getUTCFullYear()date.getUTCMonth() 进行比较,而不是简单的字符串操作。

    let data = [
      {a:'a', date:'2020-02-12'},
      {a:'a', date:'2019-12-13'},
      {a:'a', date:'2019-04-28'},
      {a:'a', date:'2019-12-15'},
      {a:'a', date:'2020-02-28'},
      {a:'a', date:'2018-12-13'}]; 
    
    // Get last date
    let last = data.map(obj => obj.date).sort((a, b) => new Date(a) - new Date(b))[data.length-1];
    console.log(last);
    
    // Get objects in last month
    let lastMonthsValues = data.filter(obj => {
      let d0 = new Date(last);
      let d1 = new Date(obj.date);
      return d1.getUTCFullYear() == d0.getUTCFullYear() &&
             d1.getUTCMonth()    == d0.getUTCMonth();
      }
    );
    
    // Last month's objects
    console.log(lastMonthsValues);

    使用字符串方法的代码少得多,而且可能效率更高。

    【讨论】:

      【解决方案4】:

      我自己做了这样的事情:

      info.incomes.sort(function(a, b) {
          return new Date(b.date)-new Date(a.date);
      });
      let comparison =[];
      for (let i in info.incomes){    
      comparison.push(info.incomes[i].date.substr(0, 7));
      }
      let lastmonth = 0;
      for (let i in comparison){
          if (comparison[0] === comparison[i]){        
              lastmonth+=parseFloat(info.incomes[i].value);
          }      
      }
      

      我只需要总结上个月的收入,所以我只是对它们进行了排序,并检查它们是否等于我上次的日期。抱歉变量命名错误=)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-03-24
        • 2018-10-14
        • 2020-04-26
        • 2012-12-09
        • 2013-09-10
        • 2011-09-09
        • 1970-01-01
        相关资源
        最近更新 更多