从包含日期的数组中获取过去 30 天

Oli*_*ner 2 javascript arrays sorting date

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

\n

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

\n
{\nid: "95",\ndatum: "2020-03-11",\ntrade: "EUR/USD BUY",\naktion: "closed",\npips: "10"\n},\n{\nid: "94",\ndatum: "2020-06-09",\ntrade: "GBP/USD BUY",\naktion: "TP Hit",\npips: "65"\n},\n{\nid: "93",\ndatum: "2020-06-08",\ntrade: "NZD/USD SELL",\naktion: "SL Hit",\npips: "-57"\n},\n
Run Code Online (Sandbox Code Playgroud)\n

datum 是德语中日期的意思。\n数组相当长(在过去半年里填充了 95 个条目)。

\n

所以我想要的输出是:

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

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

\n

这是我当前的函数,我将数据转换为日期对象:\n但我只想获取过去 30 天的条目。

\n
 chartDatumMonth() {\n      let data = this.trades;\n      data.forEach(d => {\n        d.dateObj = moment(d.datum);\n      });\n      console.log(data);\n      return data;\n    },\n
Run Code Online (Sandbox Code Playgroud)\n

控制台输出:

\n
(80) [{\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, {\xe2\x80\xa6}, __ob__: Observer]\n0:\naktion: (...)\ndateObj: Moment\n_d: Wed Aug 05 2020 00:00:00 GMT+0200 (Mitteleurop\xc3\xa4ische Sommerzeit) {}\n_f: "YYYY-MM-DD"\n_i: "2020-08-05"\n_isAMomentObject: true\n_isUTC: false\n_isValid: true\n_locale: Locale {_calendar: {\xe2\x80\xa6}, _longDateFormat: {\xe2\x80\xa6}, _invalidDate: "Invalid date", _dayOfMonthOrdinalParse: /\\d{1,2}(th|st|nd|rd)/, ordinal: \xc6\x92, \xe2\x80\xa6}\n_pf: {empty: false, unusedTokens: Array(0), unusedInput: Array(0), overflow: -1, charsLeftOver: 0, \xe2\x80\xa6}\n__proto__: Object\ndatum: "2020-08-05"\nid: (...)\npips: (...)\ntrade: (...)\n__ob__: Observer {value: {\xe2\x80\xa6}, dep: Dep, vmCount: 0}\nget aktion: \xc6\x92 reactiveGetter()\nset aktion: \xc6\x92 reactiveSetter(newVal)\nget datum: \xc6\x92 reactiveGetter()\nset datum: \xc6\x92 reactiveSetter(newVal)\nget id: \xc6\x92 reactiveGetter()\nset id: \xc6\x92 reactiveSetter(newVal)\nget pips: \xc6\x92 reactiveGetter()\nset pips: \xc6\x92 reactiveSetter(newVal)\nget trade: \xc6\x92 reactiveGetter()\nset trade: \xc6\x92 reactiveSetter(newVal)\n__proto__: Object\n1:\naktion: (...)\ndateObj: Moment {_isAMomentObject: true, _i: "2020-08-04", _f: "YYYY-MM-DD", _isUTC: false, _pf: {\xe2\x80\xa6}, \xe2\x80\xa6}\ndatum: "2020-08-04"\n
Run Code Online (Sandbox Code Playgroud)\n

Rob*_*obG 5

在 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));
Run Code Online (Sandbox Code Playgroud)