JavaScript

Как работает код?

Рекурсия. Функция вычисляет сумму зарплат всех сотрудников(salary). Не понимаю почему функция складывает только salary и игнорирует name? Объясните код пожалуйста.


let company = {
sales: [
{name: 'John', salary: 1000},
{name: 'Alice', salary: 600 }
],
development: {
sites: [
{name: 'Peter', salary: 2000},
{name: 'Alex', salary: 1800 }
],
internals: [
{name: 'Jack', salary: 1300}
]
}
};

function sumSalaries(department) {
if (Array.isArray(department)) {
return department.reduce((prev, current) => prev + current.salary, 0);
} else {
let sum = 0;
for (let subdep of Object.values(department)) {
sum += sumSalaries(subdep);
}
return sum;
}
}

alert(sumSalaries(company));
Денис __
Денис __
6 773
Так и в чем собственно вопрос? Ошибок нет, код написан с умом. Работает это следующим образом...

Запрашивается функция, которой в качестве аргумента передается объект.
 alert(sumSalaries(company)); 
Запускается проверка полученного аргумента на массив или не массив... объект массивом не является, поэтому сразу же обрабатывается else.
 if (Array.isArray(department)) {...} 
Внутри else создается переменная с нулевым значением и запускается for...of цикл, который в качестве переменной будет получать все значения в полученном ранее объекте.
 let sum = 0; 
for (let subdep of Object.values(department)) {
sum += sumSalaries(subdep);
}
Внутри цикла на каждой итерации будет вызвана эта же функция, которой в качестве аргумента передается массив... и, следовательно, сработает первое условие... при соблюдении которого используется метод reduce, технически являющийся циклом и проходящий по всему полученному массиву и собирающий числа из salary...
 department.reduce((prev, current) => prev + current.salary, 0); 
Полученное число в конце итерации возвращается и прибавляется к переменной sum... следующая итерация не начнется, пока не будет завершена предыдущая, включая возврат значения от функции.

По завершении цикла for...of в конце концов будет возвращено значение sum.
Вячеслав Артеменко
Вячеслав Артеменко
93 866
Лучший ответ
Денис __ Код рабочий и написан с умом, так как его писал не я, я хотел понять как он работает. Основной вопрос в этом коде для меня, это почему name игнорируется, и собирается только salary? Ведь в основном цикле просто собираются все поля, и name, и salary
Денис __ Сейчас попробую переписать сам, прогуглю reduce и Object.values, может станет понятнее
токрываешь в шторме и все сразу понятно где ошибки,недочеты даннные функциии, рекурсию даже показывает еще можно запустить посмотреть результат и походить дебагером поссмотреть значение любой переменной на текущей строчки
вкраце код пролазиет оп врему массиву складывает параметр salary и если попадается еще массив то его тоже обходит
но тут уже задолбали спрашиваьт одно и то же про salary - видимо тебе этот код написали где то в другом месте
Aren Soghomonyan
Aren Soghomonyan
59 846
Денис __ Этот код взят с learnjs из статьи про рекурсию
Вот тебе программистская мудрост
Не задумывался почему код работает. Он может перестать работать
Для подсчета общей суммы имена не нужны
Денис __ Ну вот мне как раз и непонятно, как работает пропуск имен
Дуров вкурсе как взломать только вконтакте
Гуф -Гуф
Гуф -Гуф
191