我试图打印数组中重复的总数。相反,元素的总数是从数组打印而不是那里的重复
const ar = [10, 20, 20, 10, 10, 30, 50, 10, 20];
function pairs(a) {
var pairCount = 0;
for (var i = 0; i < ar.length; i++) {
for (var j = i + 1; j < ar.length; j++) {
if (ar[i] === ar[j]) {
pairCount++;
}
}
}
return pairCount;
}
console.log(pairs(ar));
如果你想要重复的总数,意思是[1,1,2,2,3] // 2
,那么es6的解决方案可以非常简短和甜蜜
const ar = [10, 20, 20, 10, 10, 30, 50, 10, 20];
const duplicateCount = (a) => a.length - new Set(a).size;
console.log(duplicateCount(ar));
如果你想获得重复的总数,你可以创建另一个过滤掉的数组,然后得到差异:
const ar = [10, 20, 20, 10, 10, 30, 50, 10, 20];
const duplicatesFilteredOut = ar.filter((a, i, self) => i === self.indexOf(a))
const totalDuplicates = ar.length - duplicatesFilteredOut.length
另一种方法是使用函数reduce
和一个特殊的累加器,它提供dupes
属性作为计数器,dict
作为先前计数数字的面包屑。
const ar = [10, 20, 20, 10, 10, 30, 50, 10, 20],
dupes = ar.reduce((a, c) =>
(a.dupes += a.dict[c] || 0, a.dict[c] = 1, a), {dupes: 0, dict: {}}).dupes;
console.log(dupes);
如果要计算重复值的数量,可以这样使用filter():
const ar = [10, 20, 20, 10, 10, 30, 50, 10, 20];
let res = ar.filter((x, i) => ar.some((y, j) => y === x && i !== j));
console.log(res.length);
如果您需要有关重复值的详细信息,那么您可以执行以下操作:
const ar = [10, 20, 20, 10, 10, 30, 50, 10, 20];
let res = ar.reduce((data, curr) =>
{
data[curr] = data[curr] ? ++data[curr] : 1;
return data;
}, {});
Object.entries(res).forEach(([val, numTimes]) =>
{
if (numTimes > 1)
console.log(`Value ${val} appears ${numTimes} times`);
});
您可以使用对象来跟踪每种元素。像这样:
const ar = [10, 20, 20, 10, 10, 30, 50, 10, 20];
function pairs(arr) {
const pairCount = {};
for (let a of ar) {
if (a in pairCount) {
pairCount[a]++;
} else {
pairCount[a] = 1;
}
}
return pairCount;
}
console.log(pairs(ar));
您可以使用此函数来获取数组中重复项的总数。
const getDupCount = array => {
const uniqueItems = new Set(array)
const duplicates = array.length - uniqueItems.size
return duplicates
}
您可以将Set
作为已计算的值。
function pairs(array) {
var pairCount = 0,
visited = new Set;
for (var i = 0; i < array.length; i++) {
if (visited.has(array[i])) pairCount++;
visited.add(array[i]);
}
return pairCount;
}
console.log(pairs([10, 20, 20, 10, 10, 30, 50, 10, 20]));
这是一种在对象中按值返回重复项的方法:
const values = [10, 20, 20, 10, 10, 30, 50, 10, 20];
function duplicates(arr) {
return Object.values(arr).reduce((acc, val) => {
acc.count[val] = (acc.count[val] || 0) + 1;
if (acc.count[val] > 1) acc.duplicates[val] = acc.count[val];
return acc;
}, { count: {}, duplicates: {} }).duplicates;
}
console.log(duplicates(values));
console.log(Object.values(duplicates(values)).reduce((sum, x) => sum + x, 0));