You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用JavaScript Stomp Client订阅消息时实现数组去重存储的问题求助

解决重复消息存入数组的问题

嘿,我瞅了下你的代码,问题出在判断消息是否存在的逻辑上:当数组里已经有其他不同ID的消息时,recivedData.find(e => e.id !== parsedData.id)会找到第一个不匹配的元素,直接返回真值,这就导致哪怕当前消息的ID已经存在,这个条件也会成立,进而执行push操作,把重复的消息加进去了。

修正后的代码

咱们把逻辑简化一下,先明确判断当前消息的ID是否已经在数组里,只有不存在的时候再添加:

var recivedData = [] 
connect() 
function connect() { 
  var socket = new SockJS('/info-app'); 
  stompClient = Stomp.over(socket); 
  stompClient.connect({}, function (frame) { 
    console.log('Connected: ' + frame); 
    stompClient.subscribe('/topic/info', function (msg) { 
      var parsedData = JSON.parse(msg.body);
      // 检查数组中是否已存在相同id的消息
      const messageExists = recivedData.some(item => item.id === parsedData.id);
      
      if (!messageExists) {
        recivedData.push(parsedData);
        console.log("已添加新消息:", recivedData);
      } else {
        console.log(`消息ID ${parsedData.id} 已存在,跳过添加`);
        console.log("当前消息列表:", recivedData);
      }
    }); 
  }); 
}

为啥这么改?

  • 用some()替代find()做存在性判断:some()会遍历数组,只要找到一个匹配item.id === parsedData.id的元素就返回true,而且找到后立刻停止遍历,比find()更适合做“是否存在”的检查(毕竟我们不需要拿到具体元素,只需要布尔值)。
  • 统一处理数组为空/非空的情况:原来的代码分了数组为空和非空两种情况,其实完全没必要——空数组时some()会直接返回false,自动执行添加逻辑,逻辑更简洁。

这样修改后,相同ID的消息就不会被重复存入数组啦~

内容的提问来源于stack exchange,提问作者TheTechGuy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:33:13