javascript – 使用splice()更改数组

前端之家收集整理的这篇文章主要介绍了javascript – 使用splice()更改数组前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试编写一个函数,给定一个数组和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))

猜你在找的JavaScript相关文章