我正在使用socket.io构建一个聊天应用程序。
我需要创建一个数组来管理连接到每个聊天室的用户。
首先,我需要存储聊天室的名称,然后在那个聊天室中,每个用户和他们的状态。
chat1
nickname: user1
status: admin
nickname: user2
status: none
nickname: user3
status: none我需要它在创建或添加或删除用户时按字母顺序对昵称进行排序。这个是可能的吗?
发布于 2015-11-01 15:26:45
您所描述的不是多维数组,而是对象或地图的数组。假设物体:
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']。
注意,这是幼稚的,在排序函数中需要更好的逻辑(大写字母、数字、与字母混合的数字会发生什么,&c?)。但这种功能是完全孤立的。您只需编写一个单独的(哑巴)函数,它对聊天室对象一无所知,并将其传递给sort(),并以a.nickname和b.nickname作为参数-- chat1.sort(myFunkySortFunction(a.nickname, b.nickname)) (或者您内联逻辑,而不是抽象它,不管最简单的是什么)。
如果您有很多用户,您将开始遇到问题,因为您需要在每个联接/离开事件上运行此操作。在这一点上,您将需要更强大的东西。
Edit1:
因此,当一个新的人加入时,他们要么将一个. .push()-ed放到原始数组上,要么b。你用新的人的对象创建一个新的数组。当一个人离开时,他们要么将a从原始数组中移除,要么b.创建一个不包含它们的新数组。
当这些事件中的任何一个发生时,您可以运行排序函数。你需要看看 method。这应该是你唯一需要的。
注意,我建议的不是很有效率,它只是做工作,而且非常简单。
如果传递给排序的函数,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'}]https://stackoverflow.com/questions/33463529
复制相似问题