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