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

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

Давайте рассмотрим условие задачи.

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

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

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

Обратите внимание на String(num) - переданное число необходимо преобразовать в строку с помощью String, иначе к нему нельзя будет применить метод split.

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

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

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

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

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

Следующая функция, которую я хотел бы написать - это функция getSum, параметром принимающая массив и возвращающая сумму элементов этого массива. Пусть эта функция работает и с массивом ['1', '2', '3'], и с массивом [1, 2, 3]. Это достигается с помощью функции 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);

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