我正在尝试编写一个函数,给定一个数组和n,返回数组重复不超过n次的元素.我无法改变数组的顺序.
下面是我到目前为止的代码.令我困惑的是,它适用于给定数组中的大多数元素,但不适用于其他元素.我试图找到代码不起作用的元素的押韵或原因.
function deleteNth(arr,n){ arr.forEach(function (item,index) { var count = 0; for (var i = 0; i < arr.length; i++) { if (arr[i] === item) { count++; while (count > n) { var remove = arr.lastIndexOf(item); arr.splice(remove,1); count--; } } } }); return arr; } var x = deleteNth([7,26,21,41,43,2,24,10,35,7,28,10],2); console.log(x);
目前退回此…
[7,28]
但我应该得到这个……
[7,28]
任何洞察我出错的地方都将深表感谢.
解决方法
放置while循环的逻辑是错误的,您需要将它放在for循环之外.
function deleteNth(arr,n) { arr.forEach(function(item,index) { var count = 0; for (var i = 0; i < arr.length; i++) { if (arr[i] === item) { count++; } } while (count > n) { var remove = arr.lastIndexOf(item); arr.splice(remove,1); count--; } }); return arr; } var x = deleteNth([7,10 ],2); console.log(x);
为什么?因为当你进行循环并从中移除东西时,你会把东西放回去.因此,当你有两个并排的物品时,你将第一个物品移开,第二个物品向下移动一个点以填充刚刚移除的物品.我不会改变,所以你不检查刚填补空白的项目.
我该怎么办?我会跟踪这些项目,如果我没有超过最大值附加它.
function cleanUp (arr,max) { const cnts = {} // keep track of what we find return arr.reduce((a,i) => { // loop over the array index by index cnts[i] = (cnts[i] || 0) + 1; // mark that I seen the number if (cnts[i] <= max) { // check to see if we are under the max a.push(i) //if we are,add it to an arry } return a // return the array for reduce },[]) } console.log(cleanUp([7,2))