2010-06-30 8 views
0

상당히 많은 수의 "usrSession"개체가 있습니다.이 개체를 내 ArrayCollection usrSessionCollection에 저장합니다.고급 검색/큐 배열 컬렉션 질문

고유 한 userID가 추가 된 최신 userSessions를 반환하는 함수를 찾고 있습니다. 따라서 다음과 같이하십시오 :

1. userSessionCollection을 검색하여 userSessions per userID 만 반환하십시오.

그 다음 userSessions의 X 번호를 반환 usrSessionCollection

내가 붙어있어 그들을 삭제 한

2. 은 - 정말 나에게 도움이되는 몇 가지 코드를 싶어요.

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()); 
    } 
}); 

감사합니다.

답변

2

가장 큰 문제는 배열을 외부 세계에 비공개로 설정 한 것입니다. 배열과 상호 작용할 수있는 메서드는 addempty입니다. 배열을 검색하려면 반환 된 객체에 해당 기능을 추가하거나 배열을 노출해야합니다. 여기 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 고유 한 세션 객체를 얻기 위해 뒤로 세션 배열을 통과. 지금까지 본 모든 userID의 해시를 유지하십시오. 따라서 반복되는 userID가 나오면 무시해도됩니다. 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; 
} 

삭제 단계를 탐색 단계와 결합하지 않고 간단하게 유지합니다. 다음은 배열에서 주어진 세션을 제거하는 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; 
     } 
    }; 
} 

예 : 지난 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]); 
} 

working example를 참조하십시오.

+0

그래서 세션을 사용할 때 다음과 같이합니다 : var sessions = usrSessionCollection.getLast (2); \t \t (var i = 0; i

+0

@ seo20 더미 세션 객체'p'를 작성한 후 즉시 폐기하는 것은 무엇입니까? 너 여기서 뭘하려고하는거야? 임시 변수를 사용하지 않고'sessions [i]'의 내용을 직접 기록 할 수 있습니다. 임시 변수를 사용하더라도 불필요하게'usrSession' 객체를 생성하지 마십시오. 대신에 임시 변수에'sessions [i]'를 직접 할당하십시오. 예 -'var session = sessions [i]; alert (session.UserID);'업데이트 된 답변. – Anurag

+0

굉장히 감사합니다. –

0

배열을 비공개로 설정 했으므로 새 요소를 추가하거나 모두 제거하는 것 외에는 데이터에 액세스 할 수 없습니다. 배열을 공용으로 만들거나 공용 인터페이스를 제공하여 데이터에 액세스해야합니다. first(), next() 또는 item (index)와 같습니다.

그런 다음이 인터페이스를 사용하여 요소를 검색하고 userID로 검색하는 usrSessionCollection에 검색 (userID) 메소드를 추가 할 수 있습니다.


UPDATE :이 내가 어떻게 할 것입니다 : - See it in action. (미리보기를 클릭하십시오)

// 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

배열 기능에서 검색/제거에 대한 좀 더 구체적인 도움이 필요했습니다. –

+0

물마루로 배열을 검색 할 수 있지만 외부 **의 경우 데이터가 숨겨져 ** ** 인터페이스가 없으면 액세스 할 수 없습니다 **. 수업 기반 언어에서 왔니? 귀하의 코드는 작업에 약간 복잡해 보입니다. – galambalazs