Подсчет повторяющихся элементов в массиве: Javascript

#javascript #arrays #for-loop #object

#javascript #массивы #for-цикл #объект

Вопрос:

Не мог бы кто-нибудь, пожалуйста, просмотреть мой код и объяснить, почему мое возвращаемое значение = 3, когда оно должно быть 2? Объект имеет правильное количество {1: 2, 2: 3, 3: 1, 4: 1, 5: 1}. Только два значения равны >= 2.

   function countDuplicates(arr) {
    let dupNums = {};
    let count = 0;
    ​
    for (let i=0; i<arr.length; i  ) {
    ​
        if (dupNums[arr[i]] === undefined) {
            dupNums[arr[i]] = 0;
        }
    ​
        if (dupNums[arr[i]] !== undefined) {
            dupNums[arr[i]]  = 1;
        }
    ​
        if (dupNums[arr[i]] >= 2) {
            count  ;
        }
    }
    return count; 
    }
    console.log(countDuplicates([1,2,1,3,2,4,5,2]));
  

Комментарии:

1. потому что вы считаете их более одного раза….

Ответ №1:

У вас есть три 2 и два 1. Каждый раз, когда дубликат найден, count увеличивается.

Вместо этого выполните итерацию по значениям объекта и подсчитайте количество значений, которые равны>= 2:

 function countDuplicates(arr) {
  const dupNums = {};
  for (const num of arr) {
    dupNums[num] = (dupNums[num] || 0)   1;
  };
  return Object.values(dupNums)
    .filter(num => num >= 2)
    .length;
}
console.log(countDuplicates([1, 2, 1, 3, 2, 4, 5, 2]));  

или с помощью reduce :

 function countDuplicates(arr) {
  const dupNums = {};
  for (const num of arr) {
    dupNums[num] = (dupNums[num] || 0)   1;
  };
  return Object.values(dupNums)
    .reduce((a, num) => a   (num >= 2), 0)
}
console.log(countDuplicates([1, 2, 1, 3, 2, 4, 5, 2]));  

Комментарии:

1. Примечание: IE не поддерживает Object.values . Можно было бы использовать Object.keys иначе

2. @AmitChigadani Примечание: Microsoft прекратит поддержку IE для большинства онлайн-продуктов Microsoft в августе 2021 года. Если вы еще не начали переход, сейчас самое время. Для этого также есть несколько полизаполнений Object.values ; см. MDN .

Ответ №2:

Используйте один Set для отслеживания дублирующих элементов, а другой Set — для отслеживания количества. Для вашего сценария должно сработать следующее.

 function countDuplicates(arr) {
  const dupNums = new Set();
  const countSet = new Set();

  arr.forEach((num) =>
    dupNums.has(num) ? countSet.add(num) : dupNums.add(num)
  );

  return countSet.size;
}
console.log(countDuplicates([1, 2, 1, 3, 2, 4, 5, 2]));