使用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
相关产品推荐
相关产品推荐

