Javascript 如果元素的出现次数超过n次,则删除该元素的出现次数
所以我有一个问题,我一直坚持,但有一个答案,但不确定它到底为什么工作。。。有人能解释一下为什么这样做吗Javascript 如果元素的出现次数超过n次,则删除该元素的出现次数,javascript,Javascript,所以我有一个问题,我一直坚持,但有一个答案,但不确定它到底为什么工作。。。有人能解释一下为什么这样做吗 function deleteNth(arr,n){ var cache = {}; return arr.filter(num => { cache[num] = (cache[num]||0) + 1; // this is the line i am comfused about!! return cache[num] <= n;
function deleteNth(arr,n){
var cache = {};
return arr.filter(num => {
cache[num] = (cache[num]||0) + 1; // this is the line i am comfused about!!
return cache[num] <= n;
});
}
deleteNth([1,1,3,3,7,2,2,2,2], 3);
函数deleteNth(arr,n){
var cache={};
返回arr.filter(num=>{
cache[num]=(cache[num]| | 0)+1;//这是我一直在思考的问题!!
返回cache[num]以便通过filter函数为数组中的每个元素运行
您感到困惑的一行是设置缓存[num]
在第一次迭代中,num将是1,cache将等于{},因此cache[num]将是未定义的
它将其设置为(cache[num]| | 0),这实际上意味着如果cache[num]或0。由于cache[num]在第一个实例中未定义,它将为0。然后它将添加1
因此,每次命中该数字时,它都会添加一个,然后如果实例数低于或等于接受的数字,它就会返回,在本例中为3
当它超过该阈值时,它将等于false,现在它将不作为筛选器的一部分包含。因此,通过筛选器函数,它将为数组中的每个元素运行
您感到困惑的一行是设置缓存[num]
在第一次迭代中,num将是1,cache将等于{},因此cache[num]将是未定义的
它将其设置为(cache[num]| | 0),这实际上意味着如果cache[num]或0。由于cache[num]在第一个实例中未定义,它将为0。然后它将添加1
因此,每次命中该数字时,它都会添加一个,然后如果实例数低于或等于接受的数字,它就会返回,在本例中为3
当它超过该阈值时,它将等于false,现在它将不作为筛选器的一部分包含。cache[num]| | 0
表示如果cache[num]
没有键num
,则使用值0。
这是因为值cache[num]
在第一次出现时可以为null
var cache={}
console.log(缓存[1]);//未定义
log(cache[1]| | 0);//0
cache[num]| | 0
表示如果cache[num]
没有键,则使用值0。
这是因为值cache[num]
在第一次出现时可以为null
var cache={}
console.log(缓存[1]);//未定义
console.log(cache[1]| | 0);//0
该函数正在使用内置的筛选函数来限制数组的大小。请参阅此处的MDN文档:(cache[num]| | 0)+1
-此行检查缓存对象中的键[num]
。如果它存在,则将1添加到该计数中。如果计数[num]
是一个错误的值,0+1
将被加在一起。缓存[num]
对于第一次添加到缓存中的每个新数字都将是未定义的。该函数使用内置的筛选函数来限制数组的大小。请参阅此处的MDN文档:(缓存[num]| 0)+1
-此行检查cache
对象中的键[num]
。如果存在,则将1添加到该计数中。如果count[num]
是错误值,则将0+1
一起添加。cache[num]
对于第一次添加到缓存中的每个新数字都将是未定义的。这很好地解释了它,谢谢,尼克!这很好地解释了,谢谢,尼克!缓存[num]|0
意味着如果缓存[num]
没有键num
则使用值0”-更准确的说法是,如果cache[num]
是一个假值,那么cache[num]||0
将计算为零。非常有帮助,谢谢!“cache[num]|0
意味着如果cache[num]
没有键num
则使用值0”-更准确的说法是如果cache[num]
是一个伪值,那么缓存[num]| | 0
将计算为零。非常感谢您的帮助!