如何获取不同结构两个数组的唯一值?以及如何从视频数组中移除封禁用户?
关于数组去重与过滤的问题解答
一、获取两个结构不同数组的唯一值的最优方法
其实最优方案得结合数组的具体结构来调整,但核心思路是先把不同结构的数据转化为可对比的统一标识,再利用集合(Set)的O(1)查找特性来提升效率——毕竟嵌套遍历比对的时间复杂度太高,完全没必要。
给你捋几个常见场景的思路:
- 如果其中一个是简单值数组(比如你的
blockedUsers),另一个是对象数组(比如videoList):先把简单值数组转成Set,再遍历对象数组,取出每个对象里用来判断唯一性的核心字段(比如用户id),和Set做对比即可。 - 如果两个都是对象数组:先给每个对象生成唯一标识(比如用对象里的唯一id拼接,或者JSON.stringify关键字段),再用Set存储已出现的标识,过滤掉重复的对象。
这种方法的时间复杂度是O(n+m),比嵌套遍历的O(n*m)高效太多,算是这类问题的最优思路之一。
二、移除封禁用户对应视频的具体实现
针对你的具体需求,直接套用上面的思路就能解决,步骤很清晰:
- 把
blockedUsers转成Set,大幅提升用户id的查找效率(尤其是封禁用户数量多的时候); - 用数组的
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
相关产品推荐
相关产品推荐

