如何在头像奖励系统中筛选数组差异项生成可用奖励数组?
解决方法:反向过滤可用头像数组
嘿,这问题其实很容易搞定!你已经想到用filter方法了,只是没搞清楚怎么反向筛选——其实只要在判断条件里加个否定就行啦。
核心思路
我们需要从availableAvatar数组里排除那些已经在userAvatars里的元素,所以在filter的回调函数里,判断当前元素是否不在用户已拥有的数组里就行。
具体代码实现
var availableAvatar = ['Csimple','Calien','Ccosmonaut','CgreenAereal','ChappyBirthday']; var userAvatars = ['Ccosmonaut','ChappyBirthday']; // 反向过滤生成可奖励数组 var possibleAward = availableAvatar.filter(item => !userAvatars.includes(item)); // 随机抽取奖励 var random = possibleAward[Math.floor(Math.random() * possibleAward.length)]; console.log(possibleAward); // 输出: ['Csimple','Calien','CgreenAereal'] console.log(random); // 随机输出其中一个未拥有的头像
代码解释
!userAvatars.includes(item):includes方法会检查当前元素是否在userAvatars里,前面加!就表示“不在里面”,这样filter就会把符合这个条件的元素保留下来,也就是用户还没拥有的头像。
性能优化小技巧(可选)
如果你的userAvatars数组很大,用includes每次检查都是O(n)的时间复杂度,有点慢。这时候可以把用户已拥有的数组转成Set,因为Set.has()是O(1)的查询效率:
var userAvatarSet = new Set(userAvatars); var possibleAward = availableAvatar.filter(item => !userAvatarSet.has(item));
这样在数据量大的时候,性能会提升不少。
内容的提问来源于stack exchange,提问作者Víctor Moreno
相关产品推荐
相关产品推荐

