首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用jQuery创建/管理多维数组

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

Stack Overflow用户
提问于 2015-11-01 14:56:28
回答 1查看 104关注 0票数 1

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

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

首先,我需要存储聊天室的名称,然后在那个聊天室中,每个用户和他们的状态。

代码语言:javascript
运行
复制
chat1
     nickname: user1
     status:   admin
     nickname: user2
     status:   none
     nickname: user3
     status:   none

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-01 15:26:45

您所描述的不是多维数组,而是对象或地图的数组。假设物体:

代码语言:javascript
运行
复制
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'}]

代码语言:javascript
运行
复制
// 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']

注意,这是幼稚的,在排序函数中需要更好的逻辑(大写字母、数字、与字母混合的数字会发生什么,&c?)。但这种功能是完全孤立的。您只需编写一个单独的(哑巴)函数,它对聊天室对象一无所知,并将其传递给sort(),并以a.nicknameb.nickname作为参数-- chat1.sort(myFunkySortFunction(a.nickname, b.nickname)) (或者您内联逻辑,而不是抽象它,不管最简单的是什么)。

如果您有很多用户,您将开始遇到问题,因为您需要在每个联接/离开事件上运行此操作。在这一点上,您将需要更强大的东西。

Edit1:

因此,当一个新的人加入时,他们要么将一个. .push()-ed放到原始数组上,要么b。你用新的人的对象创建一个新的数组。当一个人离开时,他们要么将a从原始数组中移除,要么b.创建一个不包含它们的新数组。

当这些事件中的任何一个发生时,您可以运行排序函数。你需要看看 method。这应该是你唯一需要的。

注意,我建议的不是很有效率,它只是做工作,而且非常简单。

如果传递给排序的函数,a.nickname > b.nickname将不能很好地工作。A-Z将先于a-z。“薛西斯”将出现在“阿尔贝”之前。你可以这样做:

代码语言:javascript
运行
复制
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()将返回一个新数组,该数组具有特定的用户已被删除。

因此,请添加:

代码语言:javascript
运行
复制
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'}]

移除:

代码语言:javascript
运行
复制
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'}]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33463529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档