如何移除包含多数组的对象中的重复dsUserId?
解决根据
dsUserId去重数组的问题 嘿,我来帮你搞定这个去重需求!你需要在把connections数组存入state之前,先根据dsUserId字段过滤掉重复项,这样渲染下拉框的时候就不会出现重复的选项了。下面是具体的实现方法:
方法一:保留第一个出现的重复项(推荐)
用filter结合Set来追踪已经出现过的dsUserId,只保留第一次出现的元素:
// 先对connections数组做去重处理 const seenDsUserIds = new Set(); const uniqueConnections = results.data.data.connections.filter(item => { // 如果当前dsUserId已经存在,就过滤掉 if (seenDsUserIds.has(item.dsUserId)) { return false; } // 否则记录这个id,并保留当前元素 seenDsUserIds.add(item.dsUserId); return true; }); // 更新state时使用去重后的数组 this.setState({ user_connections: uniqueConnections, newLeads: results2.data.data, promotion: results3.data.data, hasPromotion: results3.data.data.length !== 0, // 这里可以简化写法哦 promoPlan: promoPlan, toRemoveDays: excludedDays }); console.log("去重后的用户数据", this.state.user_connections);
方法二:保留最后出现的重复项
如果你希望保留最后一次出现的相同dsUserId的元素,可以用Map来实现,因为Map的键会被后续的同键元素覆盖:
const uniqueConnections = Array.from( new Map(results.data.data.connections.map(item => [item.dsUserId, item])).values() ); // 同样把uniqueConnections传入setState即可 this.setState({ user_connections: uniqueConnections, // 其他state字段保持不变 newLeads: results2.data.data, promotion: results3.data.data, hasPromotion: results3.data.data.length !== 0, promoPlan: promoPlan, toRemoveDays: excludedDays });
为什么这样做?
我们在数据存入state之前就完成去重,而不是在渲染时临时处理,这样既保证了state数据的干净,也避免了每次渲染都重复执行去重逻辑,提升了性能。
修改后,你的下拉框渲染部分不需要改动,因为this.state.user_connections已经是去重后的数组了,map出来的选项自然不会有重复。
内容的提问来源于stack exchange,提问作者Dave Smith
相关产品推荐
相关产品推荐

