使用拼接方法

时间:2016-10-27 22:38:22

标签: javascript arrays

如果元素出现次数超过n次,我需要删除它的出现次数。

例如,有这个数组:

[20,37,20,21]

输出应为:

[20,37,21]

我认为解决这个问题的一种方法可能是使用拼接方法

首先,我按顺序排序它的数组:

[20,20,37,21]

然后我检查当前元素是否不等于下一个并将数组拆分成块,所以看起来应该是这样的:

[20, 20],[37],[21]

稍后我可以编辑长于1的块并再次加入它。

这就是代码在我脑海中的样子,但在现实生活中并没有起作用

var array = [20, 37, 20, 21];
var chunk = [];
for(i = 0; i < array.length; i++) {
    if(array[i] !== array[i + 1]) {
        var index = array.indexOf(array[i]);
        chunk.push = array.splice(0, index) // cut from zero to last duplicate element
    } else
        var index2 = a.indexOf(a[i]);
    chunk.push(a.splice(0, index));
}

使用此代码输出

[[], [20, 20]]

我认为它是'else'中的某些内容,但无法弄清楚要解决的问题。

4 个答案:

答案 0 :(得分:0)

由于您要实现的逻辑是删除narray个元素的出现,您的代码可能如下:

var array = [1, 1, 3, 3, 7, 2, 2, 2, 2];
var n = 2;

var removeMultipleOccurences = function(array, n) {
  var filteredArray = [];
  var counts = {};
  for(var i = 0; i < array.length; i++) {
    var x = array[i];
    counts[x] = counts[x] ? counts[x] + 1 : 1;
    if (counts[x] <= n) filteredArray.push(array[i])
  }
  return filteredArray;
}

console.log(removeMultipleOccurences(array, n));

答案 1 :(得分:0)

您可以使用Array.prototype.reduce()Array.prototype.filter()来检查n之前的元素是否与当前元素相同

let cull = (arr, n) => arr.reduce((res, curr) => [...res
           , res.filter(v => v === curr).length === n 
           ? !1 : curr].filter(Boolean), []);

let arrays = [[20,37,20,21], [1,1,3,3,7,2,2,2,2]];
              
let cullone = cull(arrays[0], 1);

let cullthree = cull(arrays[1], 3);

console.log(cullone // [20, 37, 21]
            , cullthree // [1, 1, 3, 3, 7, 2, 2, 2]
           );

答案 2 :(得分:0)

我提出了这个,基于数组过滤器检查重复值达到极限,但我可以看到@Basim的功能也是如此。

function removeDuplicatesAbove(arr, max) {
    if (max > arr.length) {max = arr.length;}
    if (!max) {return arr;}
    return arr.filter(function (v, i) {
        var under = true, base = -1;
        for (var n = 0; n < max; n++) {
            base = arr.indexOf(v, base+1); if (base == -1) {break;}
        }
        if (base != -1 && base < i) {under = false;}
        return under;
    });
}

var exampleArray = [20, 37, 20, 20, 20, 37, 22, 37, 20, 21, 37];

console.log(removeDuplicatesAbove(exampleArray, 3)); // [20, 37, 20, 20, 37, 22, 37, 21]

答案 3 :(得分:0)

当您使用splice() 截断数组时,始终在lastIndexOf()的帮助下,从一开始就使用相同 长度截断数组。它总是从0开始。

[ 1, 1, 1, 2, 2, 2, 3, 4, 4, 5 ] // splice(0, 3)
[ 2, 2, 2, 3, 4, 4, 5 ] // splice(0, 3)
[ 3, 4, 4, 5 ] // splice(0, 1)
[ 4, 4, 5 ] // splice(0, 2)
[ 5 ] // splice(0, 1)

只要数组长度大于0,就行。

var arr = [1, 1, 1, 2, 2, 2, 3, 4, 4, 5];
var res = [];

while (arr.length > 0) {
  var n = arr[0];
  var last = arr.lastIndexOf(n) + 1;
  res.push(n);
  arr.splice(0, last);
}

console.log(res);