用拼接方法截断数组

Array truncation with splice method

本文关键字:数组 方法 拼接      更新时间:2023-09-26

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

例如,有这样一个数组:
[20,37,20,21]

输出应为:

[20,37,21]

我认为解决这个问题的一种方法是使用splice方法

首先我对数组进行排序,使它像这样:

[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'的东西,但不知道该怎么修复。

由于您想要实现的逻辑是删除array中元素的n出现,您的代码可以如下所示:

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));

我想出了这个,基于数组过滤器检查重复值达到限制,但我可以看到@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]

总是当您使用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);

您可以使用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]
           );