打印javascript数组中重复的数量

问题描述 投票:1回答:8

我试图打印数组中重复的总数。相反,元素的总数是从数组打印而不是那里的重复

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));
javascript node.js
8个回答
3
投票

如果你想要重复的总数,意思是[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));

1
投票

如果你想获得重复的总数,你可以创建另一个过滤掉的数组,然后得到差异:

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

1
投票

另一种方法是使用函数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);

1
投票

如果要计算重复值的数量,可以这样使用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`);
});

0
投票

您可以使用对象来跟踪每种元素。像这样:

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));

0
投票

您可以使用此函数来获取数组中重复项的总数。

const getDupCount = array => {
    const uniqueItems = new Set(array)
    const duplicates = array.length - uniqueItems.size

    return duplicates
}

0
投票

您可以将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]));

0
投票

这是一种在对象中按值返回重复项的方法:

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));
© www.soinside.com 2019 - 2024. All rights reserved.