如果元素出现次数超过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'
中的某些内容,但无法弄清楚要解决的问题。
答案 0 :(得分:0)
由于您要实现的逻辑是删除n
中array
个元素的出现,您的代码可能如下:
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);