用拼接方法截断数组
Array truncation with splice method
如果一个元素出现超过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]
);
相关文章:
- javascript:更改应用到的数组的数组方法列表
- 使用Knockout.js的数组方法将地图标记添加到Google地图
- 模拟 javascript 的数组方法.面向对象的Javascript,作者:Stoyan Stefanov
- ECMA5 数组方法 - 查找数组中某个类型的第一个对象
- 在 Object.prototype 上为 NodeList 对象实现数组方法是否是一个很好的实践?
- 有没有一种方法可以实现chain.push和.shift数组方法
- 'document.getElementsByClassName' 的结果没有定义像 'map' 这样的数组方法,即使它
- JavaScript重写数组方法
- 有谁能告诉我在Shift的引擎盖下发生了什么吗?JavaScript中的Unshift()数组方法
- 如何删除数据库使用数组方法DELETE
- .push数组方法不工作角过滤器
- 包含数组方法的JavaScript函数没有返回期望的结果
- 对象/数组方法:修改原始的还是创建新的?指导方针
- 用自定义方法替换本机对象(数组)方法:是否安全?兼容的
- Javascript数组方法查找超过第一个值的indexOf
- 数组方法"some"的使用:收到意外的结果
- Javascript:使对象继承数组方法
- 使用数组方法遍历列表项
- 使用数组方法时返回方括号的函数
- 数组方法和连接函数组合输出在 javascript 中无法理解