javascript - 使用 splice() 就地更改数组

标签 javascript arrays

我正在尝试编写一个函数,给定一个数组和 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, 26, 24, 10, 26, 10, 10, 24, 35, 35, 
35, 43, 26, 41, 7, 24, 24, 21, 24, 10, 35, 10, 7, 24, 7, 35, 26, 41, 
35, 2, 43, 24, 2, 41, 26, 41, 7, 7, 26, 2, 10, 43, 10, 35, 41, 24, 7, 
2, 2, 7, 2, 26, 24, 26, 43, 43, 21, 10, 28, 10], 2);

console.log(x);

当前返回这个...

[7, 26, 21, 41, 43, 2, 26, 24, 10, 10, 10, 24, 35, 35, 43, 41, 7, 21, 
41, 2, 43, 28]

但我应该得到这个...

[7, 26, 21, 41, 43, 2, 26, 24, 10, 10, 24, 35, 35, 43, 41, 7, 21, 2, 
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, 26, 21, 41, 43, 2, 26, 24, 10, 26, 10, 10, 24, 35, 35,
  35, 43, 26, 41, 7, 24, 24, 21, 24, 10, 35, 10, 7, 24, 7, 35, 26, 41,
  35, 2, 43, 24, 2, 41, 26, 41, 7, 7, 26, 2, 10, 43, 10, 35, 41, 24, 7,
  2, 2, 7, 2, 26, 24, 26, 43, 43, 21, 10, 28, 10
], 2);

console.log(x);

为什么?因为当你在做你的循环并从中删除东西时,你会把东西移回去。所以当你有两个并排的项目并且你删除第一个时,第二个向下移动一个位置来填充你刚刚删除的内容。 i 不会改变,因此您不会检查刚刚填补空白的项目。

我该怎么办?我会在到达项目时跟踪这些项目,如果我没有超过最大值,则追加它。

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, 26, 21, 41, 43, 2, 26, 24, 10, 26, 10, 10, 24, 35, 35, 
35, 43, 26, 41, 7, 24, 24, 21, 24, 10, 35, 10, 7, 24, 7, 35, 26, 41, 
35, 2, 43, 24, 2, 41, 26, 41, 7, 7, 26, 2, 10, 43, 10, 35, 41, 24, 7, 
2, 2, 7, 2, 26, 24, 26, 43, 43, 21, 10, 28, 10], 2))

关于javascript - 使用 splice() 就地更改数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50377560/

相关文章:

javascript - 从现有的 <div> 获取背景图像 url 和/或向背景图像添加另一个属性

javascript - 使用ajax提交表单

javascript - React.js 问题 : How do I apply multiple classes to a component using a ternary operator?

JavaScript( typescript ): for loop not working properly

javascript - 如何优化我的算法以使用子字符串进行搜索?

javascript - 将数组对象连接成一个字符串

javascript - 自定义 jquery 函数中的 jquery/window.onbeforeload

javascript - 在 JavaScript Phaser 游戏框架中使用 onclicklistener 在循环中创建对象

c++ - 非类类型成员打印错误请求 'char'

c - C 中的数组初始化有什么不同?