Garfields
@Garfields

Как работают эти строчки?

Есть функция, которая возвращает количество повторяющихся элементов массива.

let arr = [3, 3, 7, 7, 3, 3, 4, 5, 5, 8, 8, 8];

function countIdentic(arr) {

	let obj = {}, count = 0;
	
	arr.forEach(item => {
		
		let num = obj[item];
		obj[item] = num ? num + 1 : 1;

	});

	for(let key in obj) {
		obj[key] > 1 && count++;

	};

	return count;
}

console.log(countIdentic(arr));


Конкретно интересует, как работают данные строчки:
arr.forEach(item => {
		
		let num = obj[item];
		obj[item] = num ? num + 1 : 1;

	});

Буду благодарен за объяснение.
  • Вопрос задан
  • 167 просмотров
Решения вопроса 1
potapchino
@potapchino
function countIdentic(arr) {
    return arr
      .sort()
      .reduce((acc, n, i) => arr[i + 1] === n && arr[i - 1] !== n ? ++acc : acc, 0)
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
villiwalla
@villiwalla
HTML-верстка
Эти строчки не очень, достаточно было 1 цикла или forEach. В случае интересующего куска, если num не false (0 - ноль) то прибавить 1 и присвоить это значение элементу объекта, если false то присвоить num значение 1 и элементу объекта присвоить значение из num
Ответ написан
@vladdimir
Верстальщик
Консолька все хорошо объясняет:
5e176bef801f9080234294.jpeg
В num кладут значение по ключу объекта. Ключом выступает значение из массива на текущей итерации. Каждое новое значение будет undefined (приводится к false в булевых операциях), потому как ключ еще не создан.
Далее создается ключ в объекте, если ранее не был создан (значение в массиве не повторялось). И ложится туда 1, если ключ только что создан. Если ключ в объекте есть, то к его значению добавляется 1.
Все.
Зачем и почему реализовано именно так? Ну хз - вопрос к тому, кто это писал.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы