基于userId去除对象数组重复值失败,寻求正确实现方案
问题分析与解决方案
你遇到的重复存储问题,核心是对数组元素的判断逻辑出错了——你的teamSocketsList存的是包含userId和socketId的对象,但你在用$.inArray时直接拿userID(数值/字符串)和数组里的对象比对,这肯定找不到匹配项,所以每次都会执行push,导致重复;另外else分支的去重逻辑也不对,用对象和userID比较永远不相等,等于白做。
按照你“存在则不操作,不存在再存入”的需求,直接用原生JS或者jQuery都能轻松解决:
方案一:原生JS(推荐,无需依赖jQuery)
// 遍历数组,检查是否已有相同userId的对象 const existingUser = teamSocketsList.find(item => item.userId === userID); // 不存在则推入新对象 if (!existingUser) { const teamUser = { userId: userID, socketId: socket.id }; teamSocketsList.push(teamUser); }
Array.find()会返回数组中第一个匹配条件的元素,找不到就返回undefined,这样能精准判断userId是否已存在,完全符合你的需求。
方案二:jQuery版本(如果项目依赖jQuery)
// 用$.grep过滤出userId匹配的对象,判断是否存在 const hasUser = $.grep(teamSocketsList, function(item) { return item.userId === userID; }).length > 0; if (!hasUser) { const teamUser = { userId: userID, socketId: socket.id }; teamSocketsList.push(teamUser); }
再说说你原来代码的问题:
$.inArray(userID, teamSocketsList):这个方法是在数组里找值完全等于userID的元素,但你的数组元素是对象,不是单纯的userId值,所以永远返回-1,导致每次都执行push。- else分支的
jQuery.grep:return value != userID里的value是数组中的对象,对象和数值/字符串比较永远不相等,所以过滤后的数组和原数组完全一样,根本没起到去重作用。
内容的提问来源于stack exchange,提问作者Nɪsʜᴀɴᴛʜ ॐ
相关产品推荐
相关产品推荐

