我想查看今天是否创建了数组中的项目,因此我使用 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
很明显,这个查询
应该被过滤,因为它不是今天创建的。
最佳答案
这里有几个问题。
您正在将字符串放入
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()
位,因为过滤器没有执行任何操作 ifself.onlyToday()
是假的。我的猜测是您希望在该过滤器函数之外进行检查,并且您要么调用该过滤器,要么不调用。自
enquiry.EnquiryDate
是一个日期和时间字符串,用空格分隔,首先我们将其拆分为空格,然后我们将第一部分(日期)拆分为/
。然后我们将其重新组合为yy/mm/dd
订单。现在我们知道我们可以做到
===
在字符串上查看查询日期是否等于今天。
当然,您可以使用 Date
进行此比较对象,但你只需要解析 enquiry.EnquiryDate
字符串输入Date
无论如何,对象,并且您只需要日分辨率(而不是毫秒分辨率),使用字符串比较似乎是合理的。
关于javascript - 比较 Javascript 中的日期字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13566661/