2015-11-01 37 views
1

我正在使用socket.io構建聊天應用程序。使用jQuery創建/管理多維數組

我需要創建一個數組來管理連接到每個聊天室的用戶。

首先我需要存儲的聊天室的名稱,然後在聊天室中每個用戶和他們的狀態。

chat1 
    nickname: user1 
    status: admin 
    nickname: user2 
    status: none 
    nickname: user3 
    status: none 

我需要它在按照字母順序排列暱稱時創建或添加或刪除用戶。這可能嗎?

回答

1

你所描述的不是一個多維數組,它的對象或地圖的數組。假設對象:

chat1 = [ 
    { nickname: 'ethelred', 
     status: 'admin'}, 
    { nickname: 'alfred', 
     status: 'none' }, 
    { nickname: 'canute', 
     status: 'none' } 
    ] 

// This is all that's needed for a very simple sort: 
chat1.sort((a,b) => a.nickname > b.nickname) 

這將排序,並給你[{nickname: 'alfred', status: 'none' }, {nickname: 'canute', status: 'none' }, { nickname: 'ethelred', status: 'admin'}]

// You can continue to transform the data, 
// for example, just pull the user nicknames: 
chat1.sort((a,b) => a.nickname - b.nickname) 
    .map(user => user.nickname) 

這將排序,然後在生成的分類陣圖給你按字母順序排列的用戶列表 - ['alfred','canute','ethelred']

,這是幼稚的,你需要更好的邏輯排序功能(用大寫字母,數字,數字字母混合,發生了什麼?)。但是這個功能是完全孤立的。你只寫一個單獨的(啞)函數,它什麼都不知道關於你的聊天室對象,並傳遞到sort()a.nicknameb.nickname作爲參數 - chat1.sort(myFunkySortFunction(a.nickname, b.nickname))(或您內聯的邏輯,做不是抽象的它,無論是簡單的)。

你會開始得到的問題,如果你有很多用戶,因爲你需要運行這個在每個加入/離開事件。那時你需要更強大的東西。


EDIT1:

所以,當有新成員加入,他們要麼得到。 .push() - 放到原始陣列上,或者b。你用新人的對象創建一個新的數組。當一個人離開時,他們要麼是一個人。從原始數組中移除,或者b。將創建一個不包含它們的新數組。

當這些事件發生時,您可以運行排序功能。你需要看看Array.prototype.sort() method。這應該是你唯一需要的東西。

注意,就是我的建議是不是很有效,它只是做的工作,是非常簡單的。


重新傳遞給排序功能a.nickname > b.nickname是不會工作得很好。 A-Z將在a-z之前。 'Xerxes'會在'albert'之前出現。你可以這樣做:

chat1.sort(function(a,b) { 
    return a.nickname.toLowerCase() > b.nickname.toLowerCase(); 
}) 

所以這將整理出來。但你仍然有一個更復雜的名字的問題:它值得看看像這裏描述的健壯的東西:Javascript : natural sort of alphanumerical strings

基本上,你在做什麼並不難:你只需要確保在該回調函數,則指定您正在抓取nickname屬性,否則它會嘗試基於整個對象進行排序,並返回奇怪的錯誤結果。


[很晚] EDIT2

我才意識到,你問到如何添加和刪除。保持與上述其餘部分一樣的功能主題:添加您可以使用Array.prototype.concat()創建一個包含額外用戶的新數組。要刪除,Array.prototype.filter()將返回一個刪除特定用戶的新陣列。

所以加:

current = [ 
    { nickname: 'ethelred', 
    status: 'admin'}, 
    { nickname: 'alfred', 
    status: 'none' }, 
    { nickname: 'canute', 
    status: 'none' } 
] 

current.concat({ nickname: 'offa', status: 'none' }) 

// [{ nickname: 'ethelred', status: 'admin'}, { nickname: 'alfred', status: 'none'}, { nickname: 'canute', status: 'none'}, { nickname: 'offa', status: 'none'}] 

要刪除:

current = [ 
    { nickname: 'ethelred', 
    status: 'admin'}, 
    { nickname: 'alfred', 
    status: 'none' }, 
    { nickname: 'canute', 
    status: 'none' } 
] 

current.filter({nickname} => nickname !== 'canute') 

// [{ nickname: 'ethelred', status: 'admin'}, { nickname: 'alfred', status: 'none'}] 
+0

謝謝!我需要查看哪些功能來添加/刪除等?即按照頂部的示例創建? – Jack

+0

添加了一個編輯答案,而不是添加評論:) – DanCouper

+0

剛剛看到,我沒有真正回答你的評論:增加了一些更多的信息。閱讀MDN上的Array原型方法:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/prototype – DanCouper