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

如何获取不同结构两个数组的唯一值?以及如何从视频数组中移除封禁用户?

关于数组去重与过滤的问题解答

一、获取两个结构不同数组的唯一值的最优方法

其实最优方案得结合数组的具体结构来调整,但核心思路是先把不同结构的数据转化为可对比的统一标识,再利用集合(Set)的O(1)查找特性来提升效率——毕竟嵌套遍历比对的时间复杂度太高,完全没必要。

给你捋几个常见场景的思路:

  • 如果其中一个是简单值数组(比如你的blockedUsers),另一个是对象数组(比如videoList):先把简单值数组转成Set,再遍历对象数组,取出每个对象里用来判断唯一性的核心字段(比如用户id),和Set做对比即可。
  • 如果两个都是对象数组:先给每个对象生成唯一标识(比如用对象里的唯一id拼接,或者JSON.stringify关键字段),再用Set存储已出现的标识,过滤掉重复的对象。

这种方法的时间复杂度是O(n+m),比嵌套遍历的O(n*m)高效太多,算是这类问题的最优思路之一。

二、移除封禁用户对应视频的具体实现

针对你的具体需求,直接套用上面的思路就能解决,步骤很清晰:

  1. 把blockedUsers转成Set,大幅提升用户id的查找效率(尤其是封禁用户数量多的时候);
  2. 用数组的filter方法遍历videoList,筛选出用户id不在封禁Set里的条目。

直接看代码实现:

const blockedUsers = ['u1', 'u2', 'u3'];
const videoList = [
  { id: 1, mp4URL: '...mp4', user: { id: 'u1', name: 'User 1' } },
  { id: 2, mp4URL: '...mp4', user: { id: 'u2', name: 'User 1' } },
  { id: 3, mp4URL: '...mp4', user: { id: 'u5', name: 'User 1' } }
];

// 转成Set优化查找性能
const blockedSet = new Set(blockedUsers);

// 过滤出非封禁用户的视频
const filteredVideos = videoList.filter(video => !blockedSet.has(video.user.id));

console.log(filteredVideos);
// 输出结果:[{ id: 3, mp4URL: '...mp4', user: { id: 'u5', name: 'User 1' } }]

这里为什么用Set而不是直接用blockedUsers.includes(video.user.id)?因为includes是遍历数组查找,时间复杂度O(n),而Set的has方法是O(1),当封禁用户数量较多时,性能差异会非常明显,这也是这个方案成为最优解的关键。

如果是在不支持Set的旧环境中,也可以把blockedUsers转成对象(键为用户id,值设为true),然后用!blockedObj[video.user.id]来判断,效果类似,只是Set的写法更简洁。

内容的提问来源于stack exchange,提问作者Kien Pham

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 09:52:28