2015-11-01 3 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.nickname и b.nickname в качестве аргументов - chat1.sort(myFunkySortFunction(a.nickname, b.nickname)) (или вы встраиваете логику и не абстрагируете ее, что бы ни было проще).

Вы начнете получать проблемы, если у вас много пользователей, так как вам нужно будет запускать это при каждом событии соединения/отпуска. В этот момент вам понадобится нечто более надежное.


Edit1:

Так что, когда новый человек присоединяется, они либо получить. .push() - на исходный массив, или b. вы создаете новый массив с объектом нового человека. Когда человек уходит, они либо a. удалить из исходного массива или b. создается новый массив, который их не включает.

Когда произойдет одно из этих событий, вы можете запустить функцию сортировки. Вам нужно посмотреть на Array.prototype.sort() method. Это буквально единственное, что вам нужно.

Обратите внимание, что я предлагаю не очень эффективно, он просто выполнит эту работу и очень прост.


Re функции прошла сортировку, a.nickname > b.nickname не будет работать очень хорошо. A-Z придет до a-z. «Ксеркс» предстанет перед «Альбертом». Вы могли бы сделать:

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

Только что видел, что я действительно не ответил на ваш комментарий должным образом: добавил дополнительную информацию. Прочитайте методы прототипа Array на MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/prototype – DanCouper

Смежные вопросы