使用jQuery创建/管理多维数组

时间:2015-11-01 14:56:29

标签: javascript jquery arrays

我正在使用socket.io构建聊天应用程序。

我需要创建一个数组来管理连接到每个聊天室的用户。

首先,我需要存储聊天室名称,然后在聊天室中存储每个用户及其状态。

<logger message="#[dynamicEndpoint]" level="INFO" doc:name="Logger"/>

我需要它在创建昵称或添加或删除用户时按字母顺序对昵称进行排序。这可能吗?

1 个答案:

答案 0 :(得分: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函数中使用更好的逻辑(大写字母,数字,用字母混合的数字会发生什么,&amp; c ?)。但是这个功能是完全孤立的。您只需编写一个单独的(哑)函数,该函数对您的聊天室对象一无所知,并将其传递给sort() a.nicknameb.nickname作为参数 - chat1.sort(myFunkySortFunction(a.nickname, b.nickname))(或者您内联逻辑并不抽象它,无论什么是最简单的。)

如果您有很多用户,您将开始遇到问题,因为您需要在每个加入/离开事件中运行此问题。那时你需要更强大的东西。

EDIT1:

所以当一个新人加入时,他们要么得到一个。 .push() - 编辑到原始数组或b。使用新人的对象创建一个新数组。当一个人离开时,他们要么是一个人。从原始数组中删除,或b。创建一个不包含它们的新数组。

当其中任何一个事件发生时,您可以运行sort函数。您需要查看Array.prototype.sort() method。这应该是你唯一需要的东西。

请注意,我所建议的不是很有效,它只会完成工作,而且非常简单。

重新传递给sort的函数,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'}]