【问题标题】:Check if a search result exists more than once if yes than display only one result in Javascript检查搜索结果是否存在多次,如果是,则在 Javascript 中仅显示一个结果
【发布时间】:2016-05-12 17:22:51
【问题描述】:

大家好。我正在使用 NodeJS 和 SocketIO 制作在线用户脚本。它工作正常,但我的问题是,如果用户从多个浏览器/Windows/设备...等进行连接,它会显示多个结果,例如: 48 48 48 61 所以我希望48 只显示一次,如果他只退出一个浏览器而其他浏览器仍处于连接状态,则保留它们。

这是我的代码: 客户端:

socket.on('userslist',function(users){
    var text = "";
    var i;
      for (i = 0; i < users.length; i++) {
        text += users[i].user_name + "<br>";
        document.getElementById("demo").innerHTML = text;
      }
  });

服务器端:

socket.on('user name',function(user_name){
  users.push({id:socket.id,user_name:user_name});
  len=users.length;
  len--;
  //Sending th user Id and List of users
  io.emit('user entrance',users,users[len].id);
  io.emit('userslist',users);
});

我搜索了但什么也没找到。

【问题讨论】:

    标签: javascript json node.js socket.io


    【解决方案1】:

    首先,对你的代码做一个简单的优化:

    socket.on('userslist',function(users){
        var text = "";
        var i;
        for (i = 0; i < users.length; i++) {
            text += users[i].user_name + "<br>";            
        }
        document.getElementById("demo").innerHTML = text; //<-- Only needs to happen once
      });
    

    不需要为每个用户设置innerHTML,只需在所有文本连接完成后设置一次。

    其次,保留一个单独的遍历用户数组以跟踪重复:

    socket.on('userslist',function(users){
        var usersProcessed = [];
        var text = "";
        for (var i = 0; i < users.length; i++) {
            if(usersProcessed.indexOf(users[i].user_name) < 0){
                text += users[i].user_name + "<br>";       
                usersProcessed.push(users[i].user_name);
            } 
        }
        document.getElementById("demo").innerHTML = text;
      });
    

    这是客户端的例子,但你可以在服务器上做类似的事情,只是取决于你是否需要知道是否有重复。如果没有,最好在服务器上做,以尽量减少数据传输。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-21
      • 2020-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-02
      • 2015-10-24
      相关资源
      最近更新 更多