从带有日期的数组中获取最近30天

时间:2020-08-08 10:12:02

标签: javascript arrays sorting date

我要实现的目标是在过去30天的范围内从数组中获取所有条目,并将其推入一个新的数组中,之后再使用。

我的数组(this.trades)如下:

{
id: "95",
datum: "2020-03-11",
trade: "EUR/USD BUY",
aktion: "closed",
pips: "10"
},
{
id: "94",
datum: "2020-06-09",
trade: "GBP/USD BUY",
aktion: "TP Hit",
pips: "65"
},
{
id: "93",
datum: "2020-06-08",
trade: "NZD/USD SELL",
aktion: "SL Hit",
pips: "-57"
},

datum是日期的德语单词。 数组很长(过去半年中有95个条目)。

所以我想要的输出是:

  • 按日期(this.trades.datum)对数组进行排序
  • 提取过去30天内的所有条目
  • 最后将其推入一个新的数组以使用(包含所有其他键)

我正在vuejs项目中工作,并且有机会使用计算属性进行计算,我也正在使用momentjs库。

这是我当前的函数,在这里我将基准转换为dateobjects: 但是我只想获取过去30天的条目。

 chartDatumMonth() {
      let data = this.trades;
      data.forEach(d => {
        d.dateObj = moment(d.datum);
      });
      console.log(data);
      return data;
    },

控制台输出:

(80) [{…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, __ob__: Observer]
0:
aktion: (...)
dateObj: Moment
_d: Wed Aug 05 2020 00:00:00 GMT+0200 (Mitteleuropäische Sommerzeit) {}
_f: "YYYY-MM-DD"
_i: "2020-08-05"
_isAMomentObject: true
_isUTC: false
_isValid: true
_locale: Locale {_calendar: {…}, _longDateFormat: {…}, _invalidDate: "Invalid date", _dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/, ordinal: ƒ, …}
_pf: {empty: false, unusedTokens: Array(0), unusedInput: Array(0), overflow: -1, charsLeftOver: 0, …}
__proto__: Object
datum: "2020-08-05"
id: (...)
pips: (...)
trade: (...)
__ob__: Observer {value: {…}, dep: Dep, vmCount: 0}
get aktion: ƒ reactiveGetter()
set aktion: ƒ reactiveSetter(newVal)
get datum: ƒ reactiveGetter()
set datum: ƒ reactiveSetter(newVal)
get id: ƒ reactiveGetter()
set id: ƒ reactiveSetter(newVal)
get pips: ƒ reactiveGetter()
set pips: ƒ reactiveSetter(newVal)
get trade: ƒ reactiveGetter()
set trade: ƒ reactiveSetter(newVal)
__proto__: Object
1:
aktion: (...)
dateObj: Moment {_isAMomentObject: true, _i: "2020-08-04", _f: "YYYY-MM-DD", _isUTC: false, _pf: {…}, …}
datum: "2020-08-04"

3 个答案:

答案 0 :(得分:2)

在ECMAScript中,格式为“ YYYY-MM-DD”的日期被解析为UTC。使用new Date()创建日期时,该日期基于本地日期,并且具有当前时间的组成部分,因此在比较“ 30天前”之类的值时,必须将所有数据标准化为相同的基准。在这种情况下,UTC将是最简单的。

否则,由于时区偏移量差异(UTC日期晚于或晚于本地日期),如果代码在本地日期的开始或结束时间附近运行,则会出现错误。时间部分也应设置为零。

以下内容为 n 天创建一个日期,然后过滤数据集并对其进行排序。由于提供的数据已有几个月的历史,因此我将 daysAgo 设置为传递给该函数的参数。另外,该排序使用 localCompare ,因为它比创建和比较Date对象更有效,并且可以与ISO 8601格式的日期配合使用。

let data = [{
    id: "95",
    datum: "2020-03-11",
    trade: "EUR/USD BUY",
    aktion: "closed",
    pips: "10"
  },
  {
    id: "94",
    datum: "2020-06-09",
    trade: "GBP/USD BUY",
    aktion: "TP Hit",
    pips: "65"
  }, {
    id: "93",
    datum: "2020-06-08",
    trade: "NZD/USD SELL",
    aktion: "SL Hit",
    pips: "-57"
  }];
  
function getDaysAgoData(data, daysAgo) {
  // Get current date
  let t = new Date();
  // Create UTC date for daysAgo
  let d = new Date(Date.UTC(t.getFullYear(), t.getMonth(), t.getDate() - daysAgo));
  // Filter and sort data
  return data.filter(item => new Date(item.datum) >= d)
             .sort((a, b) => a.datum.localeCompare(b.datum));
}

console.log(getDaysAgoData(data, 90));

答案 1 :(得分:0)

这应该可以帮助您

const list = [{
    id: "95",
    datum: "2020-03-11",
    trade: "EUR/USD BUY",
    aktion: "closed",
    pips: "10"
  },
  {
    id: "94",
    datum: "2020-06-09",
    trade: "GBP/USD BUY",
    aktion: "TP Hit",
    pips: "65"
  },
  {
    id: "93",
    datum: "2020-08-01",
    trade: "NZD/USD SELL",
    aktion: "SL Hit",
    pips: "-57"
  },
]


const currentDate = new Date();
const currentDateTime = currentDate.getTime();
const last30DaysDate = new Date(currentDate.setDate(currentDate.getDate() - 30));
const last30DaysDateTime = last30DaysDate.getTime();

const last30DaysList = list.filter(x => {
  const elementDateTime = new Date(x.datum).getTime();
  if (elementDateTime <= currentDateTime && elementDateTime > last30DaysDateTime) {
    return true;
  }
  return false
}).sort((a, b) => {
  return new Date(b.datum) - new Date(a.datum);
});

console.log(last30DaysList)

答案 2 :(得分:-1)

编辑:现在,数组已已排序(在第一个版本中我忘记了);

PDWORD