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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:53:14