如何仅返回数组中匹配对值的数量?

Dia*_*ine 12 javascript arrays

假设我在一次车库拍卖中发现了一盒松散的鞋子(都是同一种),并且我创建了一个数组,其中每个鞋子都按鞋子的大小列出。

我想在数组中显示鞋子尺寸的配对值数量。例如,我有这个数组:

[10,10,10,10,20,20,20,30,50]
Run Code Online (Sandbox Code Playgroud)

我要显示,3因为我们有3对数字:

[10,10,10,10,20,20,20,30,50]
Run Code Online (Sandbox Code Playgroud)

还有3个剩余的值没有匹配的对值(20,30,50)。

我怎样才能做到这一点?

Mat*_*Aft 13

这是使用的另一种方法Set

function pairNumbers(arr) {
  let count = 0;
  const set = new Set();

  for (let i = 0; i < arr.length; i++) {
    if (set.delete(arr[i])) {
      count++;
    } else {
      set.add(arr[i])
    }
  }

  return count;
}
console.log(pairNumbers([10, 10, 10, 10, 20, 20, 20, 30, 50])) // 3
Run Code Online (Sandbox Code Playgroud)


Cer*_*nce 8

我将简化为一个对象,计算每个数字的出现次数。然后再次减少Object.values对象的,以计算对数,并Math.floor(count / 2)在每次迭代时将其添加到累加器中:

function pairNumber(arr) {
  const itemCounts = arr.reduce((a, item) => {
    a[item] = (a[item] || 0) + 1;
    return a;
  }, {});
  return Object.values(itemCounts)
    .reduce((pairsSoFar, count) => pairsSoFar + Math.floor(count / 2), 0);
}
console.log(pairNumber([10, 10, 10, 10, 20, 20, 20, 30, 50]))
Run Code Online (Sandbox Code Playgroud)

.sort如果可能的话,最好避免-将计算复杂度从O(n)(最小)增加到O(n log n)