PolarBearGG
@PolarBearGG
I know that I know nothing

Можете объяснить пару строк кода?

Сама задача.
Помогите понять код.
function iqTest(numbers){        
  var nums = numbers.split(" ").map(x => x % 2);   //здесь с строки делается массив и создается новый массив с остатком

  var sum = nums.reduce((a,b) => a + b);   // здесь я не совсем понял что делается, если можно объясните пожалуйста
  var target = sum > 1 ? 0 : 1;     //проверка на остачу

  return nums.indexOf(target) + 1;  //вывод порядкового номера элемента в массиве и добавления единицы потому что счет начинается не с нуля
}
  • Вопрос задан
  • 335 просмотров
Решения вопроса 1
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
С первой строкой Вы разобрались правильно

Во второй строке используется метод массива reduce, предназначенный для свертки массива
Этот метод принимает 2 аргумента, функцию и инициализирующее значение, притом 2й аргумент не обязателен, если он отсутствует, то в качестве инициализирующего значения будет взят 0й элемент массива, а массив будет обрабатываться начиная с элемента с индексом 1.
Важно! для пустого массива метод reduce просто вернет инициализирующее значение, а если оно опущено - выкинет ошибку. Но здесь это не критично, так как метод строки split никогда не вернет пустой массив, а метод массива map всегда вернет массив той же размерности, что и исходный.
Функция переданная первым аргументом будет вызываться для каждого элемента массива, в нее передается 4 аргумента (в Вашем примере 2 последних опущены за ненадобностью):
  1. Результат предыдущего вычисления (или инициализирующее значение для первого вызова)
  2. Текущий элемент массива
  3. Индекс текущего элемента
  4. Исходный массив
Функция должна вернуть результат вычисления для текущего элемента, последний результат будет возвращен методом reduce

В третьей строке используется тернарный оператор, формат которого:
<условие> ? <результат при истине условия> : <результат при лжи>
То есть, если sum > 1 - в target запишем 0, иначе 1

Метод массива indexOf производит поиск в массиве по точному совпадению (проверяет оператором ===) с переданным аргументом и возвращает индекс первого найденного элемента или -1 если ничего не нашел

P.S. я бы решил так:
function iqTest(numbers) {
  return numbers
    .split(' ')
    .map((v, i) => ({v: v % 2, i: i + 1}))
    .find(({v}, i, arr) => i !== 0 && v !== arr[i - 1].v)
    .i;
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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