Подскажите непонятку новичку)))) [суммирование значений c нечетными индексами в массива]

Подскажите мне плиз, почему мой код, при if(i % 2 == 0), суммирует нечётные индексы, а при if(i % 2 != 0) - чётные… Разве не должно быть наоборот?
вот мой код (надо посчитать сумму эллементов с нечётным индексом):

function getSumOfOdd(arr) {
let sum = 0;
arr.filter(function(v,i){
if(i % 2 == 0) return v;
sum += v;
})
console.log(sum);
}
getSumOfOdd([1, 22, 56, 7, 9, 4]);

Лучше воспользоваться циклом forEach(). Метод массива filter() не совсем здесь уместен, так как он фильтрует массив.
Вот комментарии к твоему коду:

function getSumOfOdd(arr) {
  let sum = 0;
  // Надо использовать arr.forEach() - он здесь уместен
  arr.filter(function(v,i){
    if(i % 2 == 0) return v; // зачем возвращать здесь `v` ??
    // нечетные числа - это 1, 3, 5, ... поэтому надо использовать условие (i % 2 !== 0)
    sum += v; // идея правильная - надо при условии (i % 2 !== 0) прибавлять `v` к `sum`
    // но в данном коде `return v` будет выполняться при условии (i % 2 == 0), а строка `sum += v;` будет выполняться всегда безусловно
  })
  console.log(sum);
  // здесь надо возвращать `sum`, а то ты просто выводишь `sum` в консоль, но не возвращаешь его из функции
}
getSumOfOdd([1, 22, 56, 7, 9, 4]);
1 лайк

Спасибо, ogorobets, в который раз Вы меня спасаете)))))

2 лайка

Как принято на форуме, можно на ты.

1 лайк

Ок. Но после исправления возвращает 17((( А должно 33…

Можешь сюда скопировать и вставить свой новый вариант кода?

function getSumOfOdd(arr) {
let sum = 0;
arr.forEach(function(v,i){
if(i % 2 !== 0);
sum += v;
return(sum);
})
}
getSumOfOdd([1, 22, 56, 7, 9, 4]);

Есть такой совет, всегда старайся форматировать свой код - иначе много ошибок не увидишь. А в хорошо отформатированном коде - быстрее заметишь ошибки. Для вставки кода на форуме надо с двух сторон его окружить символами “```” (в случае если в коде несколько строк) или если это инлайновый код внутри текста то с двух сторон надо его окружит символом “`”.

function getSumOfOdd(arr) {
  let sum = 0;
  arr.forEach(function(v,i){
    if(i % 2 !== 0); // после условия if ты поставил ";" а должно быть if(<условие>) дальше код, который должен выполниться. Если этот код состоит из нескольких строк, то нужно его обернуть в фигурные скобки (символы начала и конца блока) if(<условие>) { // код из нескольких строк, который выполнится при срабатывании условия if}
    sum += v; // тут все правильно, но надо убрать ";" после условия if. То как сейчас этот код работает: условие if выполняется (i % 2 !== 0), но так как сразу после условия if стоит символ ";", то на этом выполнение оператора if завершается. Поэтому инструкция sum += v; выполняется безусловно всегда.  
    return(sum); // здесь не надо возвращать sum, так как идея считать сумму с помощью  sum += v. Значение sum надо возвращать ниже
  })

  // надо возвращать sum здесь, кода цикл forEach() уже завершился и  sum уже посчитан и без круглых скобок: return sum;
}
getSumOfOdd([1, 22, 56, 7, 9, 4]);
1 лайк

Огромнейшая благодарность!!! Теперь всё ясно))))

1 лайк