我的代码从服务器获取所有在线用户 但我只需要联系列表中的那些在线人员即可。
我有两种方法:
nested loop
可以将所有在线人与我的联系人列表中的在线人进行比较,然后只需将联系人列表中的在线人添加到我的 App中的Object
中。代码如下:people = {};
myContacts = [...];
this.socket.on('online', users => {
for (let i = users.length - 1; i >= 0; i--) {
for (let j = myContacts.length - 1; j >= 0; j--) {
if (myContacts[j].userid === users[i]) {
this.people[myContacts[j].userid] = 'online';
}
}
}
this.setState({refresh: !this.state.refresh});
});
people = {};
myContacts = [...];
this.socket.on('online', users => {
for (let i = users.length - 1; i >= 0; i--) {
this.people[users[i]] = 'online';
}
this.setState({refresh: !this.state.refresh});
});
现在我的问题是:在使用 App 的过程中,您希望我拥有上述良好表现和快速工作的最佳选择是什么?
**注:为什么我都担心,尽管它们都运行良好,但是您认为同时有10000人在线。
在这里,您可能会告诉我第二个更好,因为有一个循环, 但是,如果到那时我们有10000个人在线,那么我将感到困惑,我们将在对象中拥有10000个人,并且通过用户名访问对象中需要的在线人可能会花费很长时间。 但是在第一个代码中,人们花了很多时间,因为我们有两个循环并比较它们,但是在应用程序内访问将很容易,因为我们只有那些在线人员在我的联系人列表中。**
答案 0 :(得分:1)
IMHO浏览器的本机includes()
(应用于更大的数组)方法应该是最快的方法:
for (let j = myContacts.length - 1; j >= 0; j--) {
this.people[myContacts[j].userid] = users.includes( myContacts[j].userid ) ? 'online' : 'offline';
}
您还只能存储一个布尔值
for (let j = myContacts.length - 1; j >= 0; j--) {
this.people[myContacts[j].userid] = users.includes( myContacts[j].userid );
}
并有条件地呈现您所需的内容(翻译后的消息,图标等)
答案 1 :(得分:0)
如果您真的只想显示联系人列表中的在线人员,我认为您可以将myContacts数组转换为键/值对象{...}。密钥为userID,值为布尔值(true:在线; false:离线)。这将有助于提高性能