如果元素出现n次以上,请删除该元素的出现-我自己的代码

时间:2018-07-15 18:31:11

标签: arrays loops

function deleteNth(arr,n){
    let a = [];
    let num_string;
    arr.forEach(function(num) {
        for (let i = 0; i < arr.length; i++) { 
            if (num === arr[i]) {
                num_string++;
            }
            if (num_string  < n+1) {
                a.push(num);
            }
        }
    });
    return a;
    a.length = 0;
}

我必须创建一个程序,该程序返回没有数组变量的新数组,并且返回n次以上。计算机返回错误。

1 个答案:

答案 0 :(得分:0)

我相信这可以解决您的问题。我发表了一些评论,如果您想进一步澄清,请回复。

function filterOccurrences(arr, n) {
  // Object to store occurrences of values
  const occ = {};

  // Return array after filter
  return arr.filter(val => {
    // If occurances object already contains current value
    if (occ[val]) {
      // Add +1 count to number of occurances of value
      occ[val]++;
    } else {
      // Else add key with count 1
      occ[val] = 1;
    }

    // Return boolean whether to include current value or not
    return occ[val] <= n;
  });
}

const sample = [1, 2, 2, 3, 3, 3, 3, 3, 3];

console.log(filterOccurrences(sample, 2));
// => [ 1, 2, 2, 3, 3 ]

您提供的代码存在一些问题,例如a.length = 0;永远不会到达,因为它位于return语句之下。

说明

occ是一种JavaScript object,可以通过命名键存储值,read more here则不确定。

Filter是一种遍历数组每个值的方法,期望为每个值返回truefalse。如果结果为true,则该值将保留,否则将被忽略。

因此,当我们遍历每个值时,我们首先检查occ是否具有该值名称的键。例如,对于值1,我们将检查occ.1是否存在,但是由于该值在数组中,因此我们可以通过将数组包装在括号中来访问它,如occ[val]。如果它不存在,我们将给该对象一个具有该名称的键,并为其指定一个值1,因为它是第一次出现。但是,如果发现该值在occ对象中已经有一个键,则可以使用++运算符将该值增加1。因此,第二次出现会将计数增加到2,第三增加到3,依此类推。

最后,如果出现次数小于或等于n(允许的最大出现次数),我们将返回测试结果。如果大于上述值,将返回false,并且该值将不保留在数组中。