什么是两个代码波纹管的超级快速且首选的方式?

时间:2019-05-08 09:48:31

标签: javascript reactjs react-native socket.io

我的代码从服务器获取所有在线用户 但我只需要联系列表中的那些在线人员即可。

我有两种方法:

  1. 有两个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});
});
  1. 只有一个循环,并将所有在线用户添加到我的 App 中的对象。代码如下:
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个人,并且通过用户名访问对象中需要的在线人可能会花费很长时间。 但是在第一个代码中,人们花了很多时间,因为我们有两个循环并比较它们,但是在应用程序内访问将很容易,因为我们只有那些在线人员在我的联系人列表中。**

2 个答案:

答案 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:离线)。这将有助于提高性能