2015-01-29 2 views
1

Я пытаюсь найти разницу между двумя массивами Date, а затем разделить все разные даты на другой массив дат для последующего использования. Также есть немного больше возможностей, которые я хочу сделать. Существует переменная diffDates. Он должен быть массивом, потому что он может содержать индекс более одного месяца. С помощью этого diffDates хочу заполнить selectDiffDates.Найти разницу между двумя массивами дат в JavaScript

Просмотрите этот код, чтобы сделать его лучше и, возможно, быстрее и любые идеи по реализации вышеупомянутых последних функциональных возможностей в этом фрагменте кода. Благодарю. Link to fiddle.

Array.prototype.diff = function(a) { 
    return this.filter(function(i) { 
     return (a.indexOf(i) < 0); 
    }); 
} 

var monthIndex = [0,1,2,3,4,5,6,7,8,9,10,11]; 
var dMarked=[], dFiltered=[], selectDiffDates = []; 
dMarked=["Thu Jan 01 2015 00:00:00 GMT+0500 (Pakistan Standard Time)", 
"Thu Feb 05 2015 00:00:00 GMT+0500 (Pakistan Standard Time)", 
"Thu Mar 05 2015 00:00:00 GMT+0500 (Pakistan Standard Time)", 
"Thu Apr 02 2015 00:00:00 GMT+0500 (Pakistan Standard Time)", 
"Thu Jun 04 2015 00:00:00 GMT+0500 (Pakistan Standard Time)", 
"Thu Jan 01 2015 00:00:00 GMT+0500 (Pakistan Standard Time)"]; 

dFiltered=["Thu Jan 08 2015 00:00:00 GMT+0500 (Pakistan Standard Time)", 
"Thu Feb 12 2015 00:00:00 GMT+0500 (Pakistan Standard Time)", 
"Thu Mar 12 2015 00:00:00 GMT+0500 (Pakistan Standard Time)", 
"Thu Apr 09 2015 00:00:00 GMT+0500 (Pakistan Standard Time)", 
"Thu May 07 2015 00:00:00 GMT+0500 (Pakistan Standard Time)", 
"Thu Jun 11 2015 00:00:00 GMT+0500 (Pakistan Standard Time)"]; 

var dMarkedMonths = [], dFilteredMonths = []; 
for(var i=0; i<dMarked.length; i++){ 
dMarkedMonths.push(monthIndex[new Date(dMarked[i]).getMonth()]); 
} 
for(var i=0; i<dFiltered.length; i++){ 
dFilteredMonths.push(monthIndex[new Date(dFiltered[i]).getMonth()]); 
} 

console.log(dMarkedMonths); 
console.log(dFilteredMonths); 
var diffDates = dFilteredMonths.diff(dMarkedMonths); 

console.log("Difference: "+diffDates); 

for(var d=0; d<dFiltered.length; d++){ 
    if(new Date(dFiltered[d]).getMonth() == diffDates){ 
    selectDiffDates.push(dFiltered[d]); 
    } 
} 
console.log(selectDiffDates); 
$("#console").html(selectDiffDates); 

ответ

0

diffDates является массивом, так что вы не должны сравнивать массив с одного месяца ... а вы должны проверить, если месяц существует в diffDates массиве:

for(var d=0; d<dFiltered.length; d++){ 
    if(diffDates.indexOf(new Date(dFiltered[d]).getMonth())>-1){ 
    selectDiffDates.push(dFiltered[d]); 
    } 
} 

На части производительности: пожалуйста проверьте обновленную скрипту http://jsfiddle.net/q7rmr5uq/3/

Ваша текущая логика не соответствует вашим требованиям. В настоящее время вы выбираете месяцы и находите разные месяцы, а затем делаете даты снова с тех месяцев, которые у вас есть. Но это пропустит все те даты, у которых в тот же месяц, но разный день или год.

Лучший подход к вашему требованию должен включать поиск разницы между двумя датами, а не двумя месяцами.

+0

'diffDates' каждый элемент следует сравнивать с каждым элементом' dFiltered', это то, что делает вышеприведенный код? – LetMeCodeYou

+0

Да, потому что diffDates - это массив месяцев. – Vijay

+0

Любые советы, пожалуйста, за то, что этот код работает быстрее? Поскольку это станет частью беспорядочного и громоздкого кода :) – LetMeCodeYou