2010-12-14 6 views
1

Étant donné un tableau associatif de chaînes Date, comment puis-je trouver la date la plus proche suivante ou après?Étant donné un tableau associatif de chaînes Date, recherchez la date la plus proche suivante

MISE À JOUR: Et si c'était un tableau associatif? Comment puis-je retourner la clé pour la date la plus proche?

var matchdays = {}; 

7386: "09/14/2010" 
7387: "09/29/2010" 
7388: "10/20/2010" 
7389: "11/02/2010" 
7390: "11/24/2010" 
7391: "12/07/2010" 
7392: "12/18/2010" 

Par exemple, je pense à revenir parce que 7392 est 12/18 ou à partir d'aujourd'hui (12/14).

+2

S'il vous plaît expliquer. – Stephen

Répondre

2

Triez votre tableau, puis effectuez une recherche jusqu'à ce que vous trouviez une date plus tard qu'aujourd'hui. Vous pouvez également faire une recherche binaire, ou d'autres choses de fantaisie en fonction de la taille de votre tableau et de vos exigences de performance.

var today = new Date(); 

dateList.sort(); 

var nextLater = null; 

for (var i = 0; i < dateList.length; i++) { 
    if (dateList[i] > today) { 
    nextLater = dateList[i]; 
    break; 
    } 
} 

Mise à jour

Les tableaux associatifs sont un peu plus compliqué. Vous pouvez trier les clés par dates, puis faire la même chose que ci-dessus, ou vous pouvez simplement en suivre une à la fois en suivant le plus petit offset positif d'aujourd'hui. Le premier est comme ceci:

// Function to get the keys 
function keys(obj) { 
    var keys = []; 
    for (var key in obj) { 
     keys.push(key); 
    } 
    return keys; 
} 

// Get the keys, then sort the keys by there associated date 
var keys = keys(matchdays).sort(function(a, b) { 
    var d1 = new Date(matchdays[a]); 
    var d2 = new Date(matchdays[b]); 

    return d1 - d2; 
}); 

// Iterate through the keys, finding the key associated with the next date after today 
var today = new Date(); 
var nextLater = null; 

for (var i = 0; i < keys.length; i++) { 
    var date = new Date(matchdays[keys[i]]); 

    if (date > today) { 
     nextLater = keys[i]; 
     break; 
    } 
} 

alert(nextLater); 

tri ajoute une certaine redondance comme une recherche de force brute va être O (n) et une sorte mieux cas va être O (n) ainsi. Donc, pour la recherche de force brute, juste:

// Function to get the keys 
function keys(obj) { 
    var keys = []; 
    for (var key in obj) { 
     keys.push(key); 
    } 
    return keys; 
} 

// Get the keys 
var keys = keys(matchdays); 

// Iterate through the keys, finding the key associated with the next date after today 
var today = new Date(); 
var nextLater = null; 
var min; 

for (var i = 0; i < keys.length; i++) { 
    var date = new Date(matchdays[keys[i]]); 

    var diff = date - today; 

    if (diff > 0 && (min == undefined || diff < min) { 
     min = diff 
     nextLater = keys[i]; 
    } 
} 

alert(nextLater); 
+0

désolé - j'ai mis à jour ma question pour refléter le fait que je suis intéressé par l'utilisation de tableaux * associative * –

Questions connexes