Swift对象数组去重问题:APP关注者活动列表去重失败
嘿,我太懂你这个头疼的问题了!对象数组去重之所以难搞,就是因为哪怕两个对象内容一模一样,只要它们是不同的内存引用,普通的去重方法(比如直接用Set)根本认不出来。我给你几个实战里用过的靠谱方案,你按需选:
方案1:利用活动的唯一ID去重(最推荐)
如果你的Event对象本身就有唯一标识(比如eventId、id这类字段),这绝对是最优解——既高效又不会出错。
方法A:用对象存储已出现的ID(性能最优)
这种方式适合处理大型数组,遍历一次就能完成去重:
const uniqueEvents = yourEventArray.reduce((result, event) => { // 用对象存已经出现过的活动ID const idMap = result.__idMap || (result.__idMap = {}); if (!idMap[event.eventId]) { idMap[event.eventId] = true; result.push(event); } return result; }, []); // 最后可以删掉临时的__idMap属性(如果需要的话) delete uniqueEvents.__idMap;
方法B:用Set结合map+find(写法简洁)
中小型数组用这个更清爽:
// 先提取所有唯一ID,再根据ID匹配对应的活动对象 const uniqueEventIds = new Set(yourEventArray.map(event => event.eventId)); const uniqueEvents = [...uniqueEventIds].map(id => yourEventArray.find(event => event.eventId === id));
方案2:对比对象的核心属性去重(无唯一ID时用)
如果活动没有全局唯一ID,那就得靠能唯一标识活动的核心属性组合来判断(比如标题、开始时间、地点的组合)。
方法A:拼接核心属性成唯一键
const uniqueEvents = yourEventArray.reduce((result, event) => { // 把核心属性拼接成字符串,作为唯一判断键 const uniqueKey = `${event.title}-${event.startTime}-${event.location}`; // 检查结果数组里是否已有相同键的活动 const isDuplicate = result.some(item => { return `${item.title}-${item.startTime}-${item.location}` === uniqueKey; }); if (!isDuplicate) { result.push(event); } return result; }, []);
方法B:序列化对象(注意局限性)
如果活动对象是纯数据类型(没有函数、undefined这类无法序列化的属性),可以用JSON.stringify转成字符串后去重:
// 注意:如果对象属性顺序不同,JSON.stringify结果会不一样,可能误判 const uniqueEvents = [...new Set(yourEventArray.map(event => JSON.stringify(event)))] .map(str => JSON.parse(str));
怕属性顺序影响的话,可以先排序属性再序列化:
// 辅助函数:按属性名排序后序列化 function getSortedEventStr(event) { const sortedKeys = Object.keys(event).sort(); const sortedEvent = sortedKeys.reduce((obj, key) => { obj[key] = event[key]; return obj; }, {}); return JSON.stringify(sortedEvent); } const uniqueEvents = [...new Set(yourEventArray.map(getSortedEventStr))] .map(str => JSON.parse(str));
方案3:自定义对象相等判断函数
如果需要更灵活的判断逻辑(比如某些属性允许微小差异),可以写一个自定义相等函数,结合filter去重:
// 自定义判断两个活动是否相同的规则 function isSameEvent(eventA, eventB) { return eventA.title === eventB.title && eventA.startTime === eventB.startTime && eventA.location === eventB.location; // 可根据需求添加更多判断条件 } const uniqueEvents = yourEventArray.filter((event, index, self) => { // 找到当前活动在数组中第一次出现的位置,等于当前索引则不是重复项 return self.findIndex(item => isSameEvent(item, event)) === index; });
内容的提问来源于stack exchange,提问作者HiDungLing
相关产品推荐
相关产品推荐

