Самая большая проблема в том, что вы сделали массив закрытым для внешнего мира. Только методы, с которыми можно взаимодействовать с массивом, это add
и empty
. Чтобы иметь возможность поиска в массиве, вам нужно либо добавить эту функциональность в возвращаемый объект, либо выставить массив. Вот модифицированный 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;
}
}
}
Теперь, чтобы получить последние N уникальных объектов сеанса в usrSessionCollection
, просмотрите массив сеансов в обратном направлении. Сохраняйте хеш всех идентификаторов пользователя, увиденных до сих пор, поэтому, если появляется повторяющийся идентификатор пользователя, это можно игнорировать. Как только вы собрали N таких пользовательских сессий или достигли начала массива, верните все собранные сессии.
usrSessionCollection.getLast = function(n) {
var sessions = this.getAll();
var uniqueSessions = [];
var addedUserIDs = {}, session, count, userID;
for(var i = sessions.length - 1; i >= 0, uniqueSessions.length < n; i--) {
session = sessions[i];
userID = session.userID;
if(!addedUserIDs[userID]) {
uniqueSessions.push(session);
addedUserIDs[userID] = true;
}
}
return uniqueSessions;
}
Я бы не совмещал шаг удаления с шагом обхода, просто для простоты. Итак, вот метод удаления, который удаляет данный сеанс из массива. Опять же, лучше изменить интерфейс, возвращаемый ArrayCollection, чем напрямую вмешиваться в массив сессий.
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;
}
};
}
Пример: получить последние 10 уникальных сеансов и удалить их:
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]);
}
См. рабочий пример .