значение в массиве, которое встречается нечетное количество раз - что здесь происходит? - PullRequest
0 голосов
/ 16 июня 2020

Я наткнулся на этот код, когда проверял, как найти число, которое встречается нечетное количество раз. Я пытался все понять, но понял это. Расскажите, пожалуйста, пошагово, что происходит и что означает каждая переменная.

Спасибо!

function findOdd(A) {
    let counts = A.reduce((p, n) => (p[n] = ++p[n] || 1, p), {});
    return +Object.keys(counts).find(k => counts[k] % 2) || undefined;


Ответы [ 2 ]

1 голос
/ 16 июня 2020
  • reduce - метод Array, который должен уменьшить массив до одного значения, которое может быть самим массивом, объектом или любым типом плоской переменной
  • reduce примет функцию и начальный накопительный объект в качестве параметров
  • Функция вызывается для каждого элемента в массиве и ей передается накопительный объект в качестве первого параметра (p) и отдельный элемент массива в качестве второго параметра ( n)
  • Функция в данном случае является выражением стрелочной функции
  • Тело функции состоит из двух выражений, соединенных оператором запятой . В результате оператор запятой вернет крайнее правое выражение, в данном случае p.
  • Первое выражение оператора запятой (p[n] = ++p[n] || 1) вернет 1, если p[n] не установлено, в противном случае увеличится p[n] и будет возвращен результат. Благодаря оценке короткого замыкания логического ИЛИ (||)
  • Это можно было бы записать немного более подробно как
A.reduce(function (p, n) {
  if (p[n]) {
    p[n] = p[n] + 1
  } else {
    p[n] = 1
  }
  return p
}, {});
  • В результате вы получаете объект, который подсчитывает появление каждого значения в массиве

  • Затем у вас есть оператор return, который вернет первый ключ counts, имеющий нечетное значение

  • Это делается путем создания массива ключей counts с Object.keys.
  • Это затем перебирает эти ключи и проверяет, является ли деление по модулю на 2 (% 2) значения, соответствующего каждому ключу, истинным значением (в данном случае не нулем), а затем возвращает этот ключ.
  • Он всегда будет возвращать первый ключ с этим свойством
  • В конце это найденное значение преобразуется в число с помощью оператора унарный плюс
  • Если значение не найдено, возвращается undefined
0 голосов
/ 16 июня 2020

Здесь используются 2 метода, которые вам необходимо понять.

  1. reduce: прочтите об этом здесь https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce

  2. прочтите об этом здесь: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find

в приведенном ниже заявлении отображается сопоставление числа с его появлением

let counts = A.reduce((p, n) => (p[n] = ++p[n] || 1, p), {})

, а затем второй оператор ищет на карте элемент, который встречается нечетное количество раз, и если такой элемент не обнаружен, он возвращает undefined

return +Object.keys(counts).find(k => counts[k] % 2) || undefined

...