我看到这个问题经常被问到常规的
javascript数组,但是如果有一个日期数组,那么答案似乎都无法解决.
我可以通过试验错误地解决这个问题,但如果我问的话,我确实看到了其他人的一些好处.
基本上如果你有一个javascript数组的日期可能有重复,需要过滤到一个没有重复的数组,最好的方法是什么?
我已经尝试了Array.from(new Set(arr))的ES6解决方案,但它只返回相同的数组.
我也试过了
Array.prototype.unique = function() { var a = []; for (var i=0,l=this.length; i<l; i++) if (a.indexOf(this[i]) === -1) a.push(this[i]); return a; }
两者都来自Unique values in an array
但是没有工作,看起来像indexOf对日期对象不起作用.
这是我的数组生成atm的方式
//this is an array generated from ajax data,//its a year over year comparison with a separate year,//so to create a reliable date objects I force it to use the same year. data.map(d => { dp = new Date(Date.parse(d.date + '-' + d.year)); dp.setFullYear(2000); return dp; })
它大约有100个左右不同的日子,但它总是以350左右的指数结束.
解决方法
如果通过===比较两个日期,则比较两个日期对象的引用.表示相同日期的两个对象仍然是不同的对象.
相反,比较Date.prototype.getTime()的时间戳:
function isDateInArray(needle,haystack) { for (var i = 0; i < haystack.length; i++) { if (needle.getTime() === haystack[i].getTime()) { return true; } } return false; } var dates = [ new Date('October 1,2016 12:00:00 GMT+0000'),new Date('October 2,new Date('October 3,2016 12:00:00 GMT+0000') ]; var uniqueDates = []; for (var i = 0; i < dates.length; i++) { if (!isDateInArray(dates[i],uniqueDates)) { uniqueDates.push(dates[i]); } } console.log(uniqueDates);
优化和错误处理取决于您.