2010-06-30 7 views
0

J'ai un assez grand nombre d'objets "usrSession" Je les stocke dans ma collection usrSessionCollection ArrayCollection.Recherche avancée/file d'attente collection collection

Je cherche une fonction qui retourne les dernières userSessions ajoutées avec un userID unique. Donc, quelque chose comme ceci:

1. recherche la usrSessionCollection et ne renvoie qu'une seule session utilisateur par ID utilisateur.

2. Quand il est revenu x nombre de userSessions puis les supprimer de la usrSessionCollection

Je suis coincé - aimerais vraiment un code qui peut me aider.

function ArrayCollection() { 
    var myArray = new Array; 
    return { 
     empty: function() { 
      myArray.splice(0, myArray.length); 
     }, 
     add: function (myElement) { 
      myArray.push(myElement); 
     } 
    } 
} 

function usrSession(userID, cords, color) { 
    this.UserID = userID; 
    this.Cords = cords; 
    this.Color = color; 
} 

usrSessionCollection = new ArrayCollection(); 

$.getJSON(dataurl, function (data) { 
    for (var x = 0; x < data.length; x++) { 
     usrSessionCollection.add(new usrSession(data[x].usrID.toString(), data[x].usrcords.toString() ,data[x].color.toString()); 
    } 
}); 

Merci.

Répondre

2

Le plus gros problème est que vous avez rendu le tableau privé au monde extérieur. Seules les méthodes par lesquelles le tableau peut interagir sont add et empty. Pour pouvoir rechercher dans le tableau, vous devez soit ajouter cette fonctionnalité dans l'objet retourné, soit exposer le tableau. Voici une version modifiée ArrayCollection:

function ArrayCollection() { 
    var myArray = new Array; 
    return { 
     empty: function() { 
      myArray.splice(0, myArray.length); 
     }, 
     add: function (myElement) { 
      myArray.push(myElement); 
     }, 
     getAll: function() { 
      return myArray; 
     } 
    } 
} 

Maintenant, pour obtenir les derniers N objets de session unique usrSessionCollection, traverse le tableau de sessions en arrière. Maintenir un hachage de tous les ID utilisateur vu jusqu'ici, donc si un ID utilisateur répété arrive, cela peut être ignoré. Une fois que vous avez collecté de telles sessions utilisateur ou atteint le début du tableau, renvoyez toutes les sessions collectées. Je ne combinerais pas l'étape de suppression avec l'étape de traversée, juste pour garder les choses simples. Donc, voici la méthode remove qui supprime la session donnée du tableau. Encore une fois, il est préférable de modifier l'interface renvoyée par ArrayCollection plutôt que d'altérer directement le tableau de sessions.

function ArrayCollection(..) { 
    return { 
     .., 
     remove: function(item) { 
      for(var i = 0; i < myArray.length; i++) { 
       if(item == myArray[i]) { 
        return myArray.splice(i, 1); 
       } 
      } 
      return null; 
     } 
    }; 
} 

Exemple: Obtenez les 10 dernières sessions uniques et de les supprimer:

var sessions = usrSessionCollection.getLast(10); 
for(var i = 0; i < sessions.length; i++) { 
    console.log(sessions[i].UserID); // don't need dummy variable, log directly 
    usrSessionCollection.remove(sessions[i]); 
} 

Voir un working example.

+0

Donc quand j'utilise mes sessions, je fais quelque chose comme ceci: var sessions = usrSessionCollection.getLast (2); \t \t for (var i = 0; i

+0

@ seo20 Quel est le but de la création d'un objet session fictif 'p', puis de le supprimer immédiatement? Qu'est-ce que vous essayez de faire ici? Vous pouvez enregistrer directement le contenu de 'sessions [i]' sans utiliser de variable temporaire. Même si vous utilisez une variable temporaire, ne créez pas un objet 'usrSession' inutilement. Au lieu de cela, attribuez directement 'sessions [i]' à cette variable temp. Exemple - 'var session = sessions [i]; alert (session.UserID); 'Réponse mise à jour aussi. – Anurag

+0

Génial merci beaucoup –

0

Vous avez rendu votre tableau privé, donc vous ne pouvez pas accéder aux données, sauf ajouter un nouvel élément ou les supprimer tous. Vous devez rendre le tableau public ou fournir une interface publique pour accéder aux données. Comme first(), next() ou item (index).

Ensuite, vous pouvez ajouter une méthode search (userID) à usrSessionCollection, qui utilise cette interface pour parcourir les éléments et effectuer une recherche par userID.


MISE À JOUR: Voici comment je le ferais: - See it in action. (cliquez sur l'aperçu)

// user session 
function userSession(userID, cords, color) { 
    this.UserID = userID; 
    this.Cords = cords; 
    this.Color = color; 
} 

// a collection of user sessionions 
// a decorated array basically, with 
// tons of great methods available 
var userSessionCollection = Array; 

userSessionCollection.prototype.lastById = function(userID) { 
    for (var i = this.length; i--;) { 
    if (this[i].UserID === userID) { 
     return this[i]; 
    } 
    } 
    // NOTE: returns undefined by default 
    // which is good. means: no match 
}; 

// we can have aliases for basic functions 
userSessionCollection.prototype.add = Array.prototype.push; 

// or make new ones 
userSessionCollection.prototype.empty = function() { 
    return this.splice(0, this.length); 
}; 

////////////////////////////////////////////////////// 

// make a new collection 
var coll = new userSessionCollection(); 

// put elements in (push and add are also available) 
coll.add (new userSession(134, [112, 443], "#fffff")); 
coll.push(new userSession(23, [32, -32], "#fe233")); 
coll.push(new userSession(324, [1, 53], "#ddddd")); 


// search by id (custom method) 
var search = coll.lastById(134); 
if(search) { 
    console.log(search.UserID); 
} else { 
    console.log("there is no match"); 
} 


// empty and search again 
coll.empty(); 
search = coll.lastById(134); 
if(search) { 
    console.log(search.UserID); 
} else { 
    console.log("there is no match"); 
} 
+0

J'espérais une aide plus spécifique avec la fonctionnalité de recherche/suppression de tableau. –

+0

vous pouvez rechercher un tableau en le parcourant, mais ** si les données sont cachées ** pour l'extérieur ** et qu'il n'y a pas d'interface, vous ne pouvez pas y accéder **. Vous venez d'une langue basée sur la classe btw? Votre code semble être un peu trop compliqué pour la tâche. – galambalazs

Questions connexes