Вспомогательные функции внутри других функций в JavaScript

В данном уроке я покажу вам, как решать более сложные задачи, используя комбинации вспомогательных функций. Давайте рассмотрим условие задачи.

Пусть у нас дан массив с числами. Решим следующую задачу: запишем в новый массив только те элементы, сумма цифр в которых от 1 до 9.

Я начну решение с разработки вспомогательной функции getDigits (digit - цифра), которая параметром будет принимать число, а возвращать массив цифр. Вот эта функция:

function getDigits(num) { let str = String(num); return str.split(''); }

Этот код можно переписать короче в одну строчку:

function getDigits(num) { return String(num).split(''); }

Давайте потестируем нашу функцию на каком-нибудь числе:

console.log(getDigits(123)); // выведет ['1', '2', '3']

Обратите внимание на то, что функция вернула массив строк, а не массив чисел. Это результат работы split. Давайте здесь с этим ничего не будем делать, а просто учтем в дальнейшем.

Следующая функция, которую я хотел бы написать - это функция getSum, параметром принимающая массив и возвращающая сумму элементов этого массива. Пусть эта функция работает и с массивом чисел, и с массивом строк. Мы достигнем этого с помощью функции Number, в которую мы обернем элементы нашего массива:

function getSum(arr) { let sum = 0; for (let elem of arr) { sum += Number(elem); } return sum; }

Давайте потестируем комбинацию наших двух функций - найдем сумму цифр заданного числа:

let sum = getSum(getDigits(123)); alert(sum); // выведет 6

Следующая функция, которую мне хотелось бы иметь - это функция inRange, которая параметром принимает число и возвращает true, если сумма цифр этого числа от 1 до 9, и false - если это не так. Вот эта функция:

function inRange(num) { let sum = getSum(getDigits(num)); // используем вспомогательные функции if (sum >= 1 && sum <= 9) { return true; } else { return false; } }

Можно переписать функцию inRange в более короткой форме:

function inRange(num) { let sum = getSum(getDigits(num)); return sum >= 1 && sum <= 9; }

Давайте теперь решим нашу исходную задачу. Напомню ее: дан массив с числами, запишем в новый массив только те элементы, сумма цифр в которых от 1 до 9.

Для этого возьмем массив с числами, переберем его циклом и в цикле с помощью нашей функции inRange будем проверять, подходит ли нам этот элемент массива. Если подходит - забираем его себе:

let arr = [12, 19, 28, 13, 14, 345]; let result = []; for (let elem of arr) { if (inRange(elem)) { // если подходит - берем result.push(elem); } } console.log(result);

Окончательное решение будет выглядеть так:

let arr = [12, 19, 28, 13, 14, 345]; let result = []; function inRange(num) { let sum = getSum(getDigits(num)); return sum >= 1 && sum <= 9; } function getSum(arr) { let sum = 0; for (let elem of arr) { sum += Number(elem); } return sum; } function getDigits(num) { return String(num).split(''); } for (let elem of arr) { if (inRange(elem)) { result.push(elem); } } console.log(result);

Самостоятельно, не подсматривая в мой код, повторите решение описанной задачи.