如何在日期数组中正确使用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
为什么呢?对于JavaScriptDate
类型,有什么特别的东西需要我注意吗
以下是一个片段:
(函数(){
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);