[英]Removing duplicates in an ordered array
我要尝试做的是发现数组元素在数组中重复自身的次数,将元素及其在对象中的重复次数一起推送,然后删除该元素及其所有重复项。
目前,我有这个功能:
function getDuplicates(arr) {
let lastIndex = null;
let obj = {};
for ( let i = 0; i < arr.length; i++ ) {
lastIndex = arr.lastIndexOf(arr[i]);
obj[arr[i]] = lastIndex + 1;
arr.splice(0, lastIndex + 1 );
}
console.log(obj);
}
getDuplicates([ 1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, 5, 6 ]);
该日志: { '1': 4, '2': 2, '3': 4, '5': 5 }
它对于前3个数字(1,2和3)非常有效,但是由于lastIndex +1,没有出现4个,弄乱了5个,没有显示6个。 我是否缺少某些东西,或者有更好的方法吗?
谢谢。
这是解决问题的一种方法。
首先,我使用new Set()
从给定数组中删除了所有重复的元素,然后使用Array#forEach
在其上进行迭代,并使用Array#filter
检查了给定元素在传递的数组中出现了多少次。
function getDuplicates(arr){ var filtered = [...new Set(arr)], result = {}; filtered.forEach(function(v){ result[v] = arr.filter(c => c == v).length; }) console.log(result); } getDuplicates([ 1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, 5, 6 ]);
Array#reduce
解决方案。
function getDuplicates(arr) { var res = arr.reduce(function(s, a) { s[a] = arr.filter(c => c == a).length; return s; }, {}); console.log(res); } getDuplicates([1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, 5, 6]);
您可以简化很多逻辑。 只是一个要计数的对象,一个if语句用于增加值或如果未定义则定义为1。
function countDuplicates(arr) { // Contains a pair of values an instances. var counting = {}; // Iterate array: check if already counted. If yes, increment, if not define as 1. for (el of arr) (counting[el]) ? counting[el]++ : counting[el] = 1; console.log(counting); return counting; } countDuplicates([ 1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, 5, 6 ]);
另外,如果您还想获得唯一元素,则可以使用E6 set :
var set = new Set([ 1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, 5, 6 ]);
看起来好像您想计数重复项,但是如果您要做的只是按照@ChantryCargill的建议删除重复项(如标题所示):
function removeDuplicates (arr) {
var results = [];
for(var i = 0; i < arr.length; i++) {
var item = arr[i];
if(results.indexOf(item) === -1) {
results.push(item);
}
}
return results;
}
console.log(removeDuplicates([ 1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, 5, 6 ]));
//[1, 2, 3, 4, 5, 6]
如果您要COUNT个重复项:
function getDuplicates(arr) {
var results = {};
for(var item of arr) {
if(!results[item]) {
results[item] = 0;
}
results[item]++;
}
return results;
}
console.log(getDuplicates([ 1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, 5, 6 ]));
//{"1":4,"2":2,"3":4,"4":2,"5":3,"6":1}
您可以简单地使用Array#reduce()
来计数出现次数,并使用Array#filter()
来删除重复项
getDuplicates([1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, 5, 6]); function getDuplicates(arr) { var obj = arr.reduce((map, item) => (map[item] = ++map[item] || 1, map),{} ); var withoutDup = arr.filter((item, pos) => arr.indexOf(item) == pos); console.log(JSON.stringify(obj)); console.log(JSON.stringify(withoutDup)); }
您可以根据需要进行计数和打印:
function getDuplicates(arr) {
var counts = {};
arr.forEach(function(x) { counts[x] = (counts[x] || 0)+1; });
console.log(counts);
}
function getDuplicates(arr) {
let lastNum = null;
let obj = {};
for ( let i = 0; i < arr.length; i++ ) {
if (arr[i] != lastNum){
lastNum = arr[i];
obj[arr[i]] = 1;
}else{
obj[arr[i]]++;
}
}
console.log(obj);
}
尝试这个:
function getDuplicates(){ var numbers=Array.prototype.slice.call(arguments); var duplicates={}; for(var index in numbers){ if(numbers.indexOf(numbers[index])==index) continue; duplicates[numbers[index]]= (duplicates[numbers[index]] || 0) + 1; } return duplicates; } console.log(getDuplicates(1,2,3,1,1,3,4,5,6,7,8,6)); /* prints { 1: 2, 3: 1, 6: 1 } */
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.