如何在日期数组中正确使用JavaScript indexOf

如何在日期数组中正确使用JavaScript indexOf,javascript,Javascript,代码如下: var collection = [new Date(2014, 11, 25), new Date(2014, 11, 24)]; var d=new Date(2014, 11, 24); var idx= collection.indexOf(d); 我猜变量idx的值应该是1,因为它是数组集合中的第二个值。但结果是-1 为什么呢?对于JavaScriptDate类型,有什么特别的东西需要我注意吗 以下是一个片段: (函数(){ var集合=[新日期(2014年11月25

代码如下:

var collection = [new Date(2014, 11, 25), new Date(2014, 11, 24)];
var d=new Date(2014, 11, 24);

var idx= collection.indexOf(d);
我猜变量
idx
的值应该是
1
,因为它是数组
集合中的第二个值。但结果是
-1

为什么呢?对于JavaScript
Date
类型,有什么特别的东西需要我注意吗

以下是一个片段:

(函数(){
var集合=[新日期(2014年11月25日),新日期(2014年11月24日)];
var d=新日期(2014年11月24日);
var idx1=collection.indexOf(d);
var intArray=[1,3,4,5];
var idx2=intArray.indexOf(4);
$('btnTry1')。在('click',function()上{
$('#result1').val(idx1);
});
$('btnTry2')。在('click',function()上{
$('#result2').val(idx2);
});
})();

索引:
在日期数组中查找索引

索引: 在常规数组中查找索引这是因为“d”对象是不同的对象。换言之:

var d = new Date(2014, 11, 24);

d === new Date(2014, 11, 24); // returns false
您可以尝试以下方法:

var d = new Date(2014, 11, 24);
var collection = [new Date(2014, 11, 25), d];

var idx = collection.indexOf(d); // returns 1
除非序列化两个对象,否则它们永远不会相等。幸运的是,日期很容易序列化为整数

var collection = [new Date(2014, 11, 25), new Date(2014, 11, 24)],
    d = new Date(2014, 11, 24),
    idx;

idx = collection.map(Number).indexOf(+d); // 1
//              ^^^^^^^^^^^^         ^ serialisation steps

两个不同的对象永远不会彼此相等,即使它们具有相同的特性/值。以下是对这个问题的前瞻性回答:

ECMAScript 6引入了一个接受比较回调的函数:

var index = collection.findIndex(function(x) { 
    return x.valueOf() === d.valueOf(); 
});

Array.prototype.indexOfDate=函数(日期){
for(var i=0;i
indexOf()
在这里不起作用。。。在前面的回答中已经很好地解释了

您可以为索引创建自己的查找。下面是一个简单的示例,使用它们的
.getTime()
值比较日期

(函数(){
var集合=[新日期(2014年11月25日),新日期(2014年11月24日)];
var d=新日期(2014年11月24日);
变量idx1=-1;
collection.forEach(函数(项、索引){
如果(d.getTime()==item.getTime())
idx1=指数;
});
var intArray=[1,3,4,5];
var idx2=intArray.indexOf(4);
$('btnTry1')。在('click',function()上{
$('#result1').val(idx1);
});
$('btnTry2')。在('click',function()上{
$('#result2').val(idx2);
});
})();

索引:
在日期数组中查找索引

索引:
在规则数组中查找索引
d
是日期的新实例,即使日期与索引1相同,对象也不同,因此结果为-1。两个不同的实例永远不相等。仅供参考,ES6通过引入接受回调进行比较来解决这个问题:
collection.findIndex(函数(x){return x.valueOf()==d.valueOf();}).Related:谢谢。现在我明白为什么了。但是什么是查看数组中是否包含日期值的正确方法呢?太好了!你的
map
+d
让我大开眼界。假设日期是在一系列对象中,比如
data=[{date:date 2018-09-15T00:00:00.000Z,pn:55,other:“blah”},…]
地图和类似的东西会如何翻译?
Array.prototype.indexOfDate = function(date){
   for (var i = 0; i < this.length; i++){
      if (+this[i] === +date) return i;
   };
   return -1;
};

// then 
var idx1 = collection.indexOfDate(d);