Javascript 高级搜索/队列数组集合问题

Javascript 高级搜索/队列数组集合问题,javascript,jquery,collections,queue,Javascript,Jquery,Collections,Queue,我有大量的对象“usrSession”,我将它们存储在我的ArrayCollection usrSession集合中 我正在寻找一个函数,它返回添加了唯一userID的最新userSessions。比如说: 一,。 搜索usrSessionCollection,每个用户ID只返回一个userSessions 二,。 当它返回x个userSessions后,将其从usrSessionCollection中删除 我被卡住了-我真的很喜欢一些能帮我解决这个问题的代码 function ArrayCol

我有大量的对象“usrSession”,我将它们存储在我的ArrayCollection usrSession集合中

我正在寻找一个函数,它返回添加了唯一userID的最新userSessions。比如说:

一,。 搜索usrSessionCollection,每个用户ID只返回一个userSessions

二,。 当它返回x个userSessions后,将其从usrSessionCollection中删除

我被卡住了-我真的很喜欢一些能帮我解决这个问题的代码

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());
    }
});
函数ArrayCollection(){
var myArray=新数组;
返回{
空:函数(){
myArray.splice(0,myArray.length);
},
添加:函数(myElement){
myArray.push(myElement);
}
}
}
功能usrSession(用户标识、跳线、颜色){
this.UserID=UserID;
这个。跳线=跳线;
这个。颜色=颜色;
}
usrSessionCollection=newarraycollection();
$.getJSON(数据URL,函数(数据){
对于(var x=0;x

谢谢。

您已将数组设置为私有,因此除了添加新元素或删除所有元素外,您无法访问数据。您需要将数组设置为公共数组,或提供公共接口来访问数据。如first()、next()或item(index)

然后,您可以向usrSessionCollection添加一个搜索(userID)方法,该方法使用此接口遍历元素并按userID进行搜索


更新:我将这样做:-。(单击预览)


最大的问题是您已将数组设置为外部世界的私有数组。可以与数组交互的唯一方法是
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;
        }   
    }
}
现在,要获取
usrSessionCollection
中的最后N个唯一会话对象,请向后遍历会话数组。保留到目前为止看到的所有用户ID的哈希值,因此如果出现重复的用户ID,则可以忽略该值。一旦收集了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;
}
usrSessionCollection.getLast=函数(n){
var sessions=this.getAll();
var uniqueSessions=[];
var addedUserID={},会话,计数,用户ID;
对于(var i=sessions.length-1;i>=0,uniqueSessions.length
为了简单起见,我不会将删除步骤与遍历步骤结合起来。因此,下面是从数组中删除给定会话的remove方法。同样,最好修改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;
        }
    };
}
函数数组集合(…){
返回{
..,
删除:功能(项目){
对于(var i=0;i
示例:获取最后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]);
}
var sessions=usrSessionCollection.getLast(10);
对于(var i=0;i

请参阅。

我希望在搜索/从数组中删除功能方面获得一些更具体的帮助。您可以通过搜索数组来搜索数组,但是如果数据为外部隐藏且没有接口,则无法访问它。顺便说一句,您来自基于类的语言?您的代码对于任务来说似乎有点过于复杂。所以,为什么n我在使用我的会话时,我会这样做:var sessions=usrSessionCollection.getLast(2);for(var I=0;Ip
,然后立即丢弃它有什么意义?你想在这里做什么?你可以记录
会话[i]的内容
直接而不使用临时变量。即使使用临时变量,也不要不必要地创建
usrSession
对象。相反,直接将
sessions[i]
分配给该临时变量。示例-
var session=sessions[i];alert(session.UserID);
也更新了答案。
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]);
}