【问题标题】:Using Moment to compare dates to filter results使用 Moment 比较日期以过滤结果
【发布时间】:2015-02-17 18:11:05
【问题描述】:

我正在尝试按每个对象中的日期键过滤一组对象。

for (var e = 0; e < arrayOfObjects.length; e++){
    var objects = arrayOfObjects[e];
    var sortDate = _.filter(objects, function(n) {moment(n.date).isAfter(moment(timeCreated).subtract(110, 'days'))});
    console.log(sortDate); //console.log((moment(timeCreated).subtract(110, 'days')));
}

此代码返回一个空数组。在 timeCreated 之前和之后都有不同的日期 - 110 天。我还控制台记录了比较的每个部分:

   Moment {_isAMomentObject: true, _i: "2014-07-24", _f: "YYYY-MM-DD ", _isUTC: false, _pf: Object…}_d: Thu Jul 24 2014 00:00:00 GMT-0700 (PDT)_f: "YYYY-MM-DD "_i: "2014-07-24"_isAMomentObject: true_isUTC: false_locale: Locale_pf: Object__proto__: Moment
dateCompare.controller.js:91 

Moment {_isAMomentObject: true, _i: Thu Feb 12 2015 20:22:41 GMT-0800 (PST), _isUTC: false, _pf: Object, _locale: Locale…}_d: Fri Nov 14 2014 20:22:41 GMT-0800 (PST)_i: Thu Feb 12 2015 20:22:41 GMT-0800 (PST)_isAMomentObject: true_isUTC: false_locale: Locale_pf: Object__proto__: Moment

【问题讨论】:

    标签: arrays object underscore.js momentjs


    【解决方案1】:

    如果要包含值但您的谓词,则您传递给_.filter 的谓词函数应该返回true:

    function(n) {moment(n.date).isAfter(moment(timeCreated).subtract(110, 'days'))}
    

    总是返回undefined,因为它没有return。 JavaScript 函数没有隐式返回值,你必须是显式的:

    function(n) {
        return moment(n.date).isAfter(moment(timeCreated).subtract(110, 'days'))
    // -^^^^^^
    }
    

    此外,您正在尝试 _.filter 单个对象,而不是数组。在循环内你有:

    var objects = arrayOfObjects[e];
    

    然后你 _.filter(objects, ...) 不会做任何有用的事情。

    如果包含return 语句并过滤数组:

    _.filter(arrayOfObjects, function(n) {
        return moment(n.date).isAfter(moment(timeCreated).subtract(110, 'days'))
    });
    

    那应该没问题。

    演示:http://jsfiddle.net/ambiguous/p7uab8uj/

    【讨论】:

    • 我尝试了您的建议,但没有奏效。下划线正在起作用,因为此 JS 文件中的先例依赖于它。 Moment 也可以通过 console.log 工作。其他想法?
    • 我收到未经过滤的结果。反过来说,_.result 返回 undefined。
    • 你在 jsfiddle.net 或 jsbin.com 上有演示吗?
    • jsfiddle.net/m3hLd937 它不会工作,因为 jsfiddle 没有时间
    • 您的演示不包括timeCreated。您始终可以在侧边栏的外部资源面板中包含来自 CDN 的额外库。
    【解决方案2】:
    for (var e = 0; e < arrayOfObjects.length; e++) {
        var objects = arrayOfObjects[e];
        if (moment(objects.date).isAfter(moment(timeCreated).subtract(100, 'days'))) {
            var goodDates = [];
            goodDates.push(objects);
            console.log(goodDates);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-04-24
      • 1970-01-01
      • 2014-05-01
      • 2017-10-25
      • 1970-01-01
      • 1970-01-01
      • 2015-10-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多