我想知道我的数组中的项是否是今天创建的,所以我使用arrayFilter来过滤我的数组中的每个元素,问题是,我无法使我的过滤器正常工作:
return ko.utils.arrayFilter(self.enquiries(), function (enquiry) {
var include = true;
if (self.onlyToday()) {
var formatted = $.datepicker.formatDate("dd/mm/yy", new Date());
include = include && +enquiry.EnquiryDate.indexOf(+formatted > -1);
}
return include;
});
以下是我的数据:
formatted: 26/11/2012
enquiry.EnquiryDate: 08/11/2012 08:46:46
很明显,应该过滤此enquiry
,因为它今天没有创建。
答案 0 :(得分:2)
这里有几个问题。
您在formatted
中添加了一个字符串,然后使用+formatted > -1
。 +formatted
始终为NaN
,永远不会> -1
(它也永远不会等同于-1
而永远不会< -1
。)
您将include
设置为true
,然后执行include = include && ...
。 &&
之后的部分永远不会被评估,因为&&
左侧的部分是true
,而JavaScript(就像大多数现代语言一样)是短路表达式。
如果enquiry
引用某个对象,+enquiry
可能会NaN
,除非您已覆盖其valueOf
。
您正在比较字符串,这意味着比较的最重要部分将位于左侧 - 但您的日期字符串采用的格式是最重要的值在右。例如,字符串 "01/01/2013"
小于 字符串 "02/02/2012"
,即使当然不是这样他们所代表的日期。如果你想有意义地比较日期字符串,他们必须在左边是年份,然后是月份,然后是当天。
根据您引用的enquiry.EnquiryDate
字符串,您可以执行以下操作:
var today = $.datepicker.formatDate("yy/mm/dd", new Date());
return ko.utils.arrayFilter(self.enquiries(), function (enquiry) {
var parts, enqDate;
parts = enquiry.EnquiryDate.split(' ')[0].split('/');
enqDate = parts[2] + '/' + parts[1] + '/' + parts[0];
return enqDate === today;
});
以上注释:
请注意,我今天的日期是左边的年份。
我删除了self.onlyToday()
位,因为如果self.onlyToday()
为false,则过滤器没有执行任何操作。我的猜测是你想要在这个过滤器功能之外进行检查,你要么打算调用这个过滤器。
由于enquiry.EnquiryDate
是日期和时间字符串,以空格分隔,首先我们将其拆分为空格,然后我们取第一部分(日期)和将其拆分为/
。然后我们以yy/mm/dd
顺序重新组合。
现在我们知道我们可以对字符串执行===
查看查询日期是否等于今天。
当然,您可以使用Date
个对象进行此比较,但是您只需要将enquiry.EnquiryDate
字符串解析为Date
个对象,而您只需要一天分辨率(不是毫秒分辨率),使用字符串比较似乎是合理的。