Найти количество повторных чисел в данном массиве и вернуть результат в виде объекта - PullRequest
0 голосов
/ 21 февраля 2020

Мне задали этот вопрос в одном из моих недавних интервью. Для данного массива, скажем, Arr[2,2,4,3,4,2,3,2,4] напишите функцию javascript, чтобы вернуть объект с количеством каждого числа в указанном выше массиве, например

countArr={2:4,3:2,4:3}

После того, как я много раз закончил Google с кодом ниже, который возвращает правильные данные.

var uniqueCount = [2, 2, 4, 3, 4, 2, 3, 2];
var count = {};
uniqueCount.forEach(function(i) {
  count[i] = (count[i] || 0) + 1;
});
console.log(count);

Как я уже сказал, это прекрасно работает! Output: {2: 4, 3: 2, 4: 2} Что ж, код без должного понимания того, что происходит на заднем плане, ничего не значит для разработчика:)

Может кто-нибудь помочь мне понять, как это на самом деле работает?

Ответы [ 4 ]

1 голос
/ 21 февраля 2020

Основная работа по созданию объекта с каждым из уникальных элементов массива происходит в следующем блоке:

uniqueCount.forEach(function(i) {
   count[i] = (count[i] || 0) + 1;
});

Здесь мы перебираем каждый элемент массива, как в 'для l oop'. Я надеюсь, что вы знакомы с работой 'для l oop'. Затем мы передаем каждый элемент массива в функцию.

count[i] = (count[i] || 0) +1;

можно записать как:

if(count[i]) {
   count[i] = count[i] + 1;
} else {
   count[i] = 1;
}

Надежда, которая поможет вам понять код.

0 голосов
/ 21 февраля 2020

Код использует объект как карту от числовых значений до целых чисел их частоты.

1.  var uniqueCount = [2, 2, 4, 3, 4, 2, 3, 2];
2.  var count = {};
3.  uniqueCount.forEach(function(i) {
4.    count[i] = (count[i] || 0) + 1;
5.  });
6.  console.log(count);

Строка 1: объявить переменную uniqueCount и присвоить ей новый массив чисел.

Строка 2: объявить переменную count и присвоить ей новый пустой объект.

Строка 3: запустить анонимную функцию один раз для каждого числа в uniqueCount.

Строка 4. Присвойте свойству count имя с текущим номером в массиве: один плюс существующее значение свойства или, если свойство еще не существует, ноль.

Строка 6: вывести окончательное состояние count.

Код был бы понятнее, если бы переменная i в анонимной функции была названа n (или что-то еще), потому что i (да, я знаю, что это означает "целое число" здесь) обычно означает "индекс", а здесь это не индекс.

Обратите внимание, что в JavaScript просто присваивается Значение свойства объекта создаст это свойство, если оно еще не существует.

0 голосов
/ 21 февраля 2020

Хорошо, это на самом деле просто. Давайте go шаг за шагом.

var count = {};

Объявляет объект JS. Это в основном хранилище ключей. Вы можете получить доступ к значению ключа, написав count[key]. Затем сохраните или извлеките значение.

Рассмотрите этот простой пример:

var count = {}
count['ok'] = 3
console.log(count)

Он выводит { ok: 3 }

Теперь замените 'ok' на число, и вы получите структура остальной части кода: ключи добавляются к объекту для каждого числа, найденного в массиве, или увеличиваются, когда они существуют.

Давайте продолжим с кодом.

uniqueCount.forEach(function(i) {
  // code here is called for each entry in the uniqueCount array, i being the current value.
});

И, наконец, здесь происходит волшебный c:

count[i] = (count[i] || 0) + 1;

Слева направо, он читает: присвойте свойству i объекта count значение, которое является его текущим значением или 0, если его нет, то добавьте 1. Поэтому, если число i уже было замечено, оно принимает предыдущее значение и добавляет 1; если его не видели, он принимает 0 и добавляет единицу.

Поэтому, когда вы сохраняете console.log (count), вы получаете значения для всех этих свойств.

0 голосов
/ 21 февраля 2020

Полагаю, вас смутила только одна строка:

count[i] = (count[i] || 0) + 1; означает

Если счет для di git i set count [уже есть. я] к этому значению, в противном случае установите его на 0 (инициализируйте его), затем добавьте 1 к тому, что находится в счетчике [я] сейчас

Можно переписать так, чтобы сделать его более понятным - заметьте, я изменил имена переменных, массивов и объектов

var array = [2, 2, 4, 3, 4, 2, 3, 2];
var uniqueCount = {};
array.forEach(function(digit) {
  if (uniqueCount[digit]) uniqueCount[digit]++; // if counter for the digit exist, add 1 
  else uniqueCount[digit] = 1; // else initialise it to 1
});
console.log(uniqueCount);
...