在Javascript中,我试图只在一个数组中保留Duplicates。
例如我的初始数组是
[1,1,2,3,3,3,3,4,5,5]
结果应为
[1,3,5]
我尝试过使用.indexOf()和$ .inArray(),但无法理解。我知道如何删除重复项,但保留它们非常困难。
答案 0 :(得分:4)
您可以通过检查项目是否是第一个以及最后一个索引是否不是实际索引进行过滤。
var array = [1, 1, 2, 3, 3, 3, 3, 4, 5, 5],
result = array.filter((a, i, aa) => aa.indexOf(a) === i && aa.lastIndexOf(a) !== i);
console.log(result);
答案 1 :(得分:1)
您可以使用array#reduce
计算每个值的频率,然后使用计数大于1的array#filter
值。
var data = [1,1,2,3,3,3,3,4,5,5];
var count = data.reduce((o,v)=>{
o[v] = o[v]+1 || 1;
return o;
},{});
var duplicate = Object
.keys(count)
.filter(k => count[k] > 1)
.map(Number);
console.log(duplicate);
.as-console-wrapper { max-height: 100% !important; top: 0; }
使用Map的另一个解决方案版本。
var data = [1,1,2,3,3,3,3,4,5,5];
var count = data.reduce((map,v)=>{
map.set(v, (map.get(v) || 0) + 1);
return map;
},new Map());
var duplicate = Array.from(count)
.filter(a => a[1] > 1)
.map(a => a[0]);
console.log(duplicate);
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 2 :(得分:0)
这是我的程序解决方案:
var arr = [1,1,2,3,3,3,3,4,5,5]
var arr2 =[];
for(var i=0; i < (arr.length-1); i++){
if (arr2.indexOf(arr[i]) > -1 || arr[i] != arr[i+1]){
//Do Nothing and move on to the next set
}
else{
arr2.push(arr[i]);
}
}
答案 3 :(得分:0)
以上所有方法都使用O(n2)进行扩展,如果您想达到O(n)时间,那么这里就是解决方法。
function getDuplicates(arr){
const hashTable = {}
const duplicate = [];
arr.forEach((item) => {
if(hashTable[item]){
if(hashTable[item] === 1){
duplicate.push(item);
}
hashTable[item] = hashTable[item] + 1;
} else {
hashTable[item] =1;
}
})
return duplicate;
}
我还写了article来说明如何使用像哈希表这样的javascript对象有效地从数组中删除重复项。