Здравствуйте, друзья.
Прошу проверить, выполненные мной задачи по js
Первые две задачи очень похожи и я попробовал написать для них решения чуть по-разному
Если оба решения правильны, то подскажите какое из них более грамотное?
Так же буду признателен за примеры оптимальных решений для всех задач
Задача #1
Условие
Написать функцию `isAllTrue`, которая принимает 2 параметра: `source` и `filterFn`, где `source` - массив, `filterFn` - фильтрующая функция
Если фильтрующая функция вернет `true` для ВСЕХ элементов массива, то и сама `isAllTrue` вернет `true`
Если фильтрующая функция вернет `false` хотя бы для одного элемента массива, то и сама `isAllTrue` вернет `false`
Выбрасывать и обрабатывать исключение, если в 'source' пустой массив
Пример
var allNumbers = [1, 2, 4, 5, 6, 7, 8],
someNumbers = [1, 2, 'привет', 4, 5, 'мир', 6, 7, 8],
noNumbers = ['это', 'массив', 'без', 'чисел'];
function isNumber(val) {
return typeof val === 'number';
}
console.log(isAllTrue(allNumbers, isNumber)); //вернет true
console.log(isAllTrue(someNumbers, isNumber)); //вернет false
console.log(isAllTrue(noNumbers, isNumber)); //вернет false
Решение
let source1 = [1,2,3],
source2 = ['text',2],
source3 = [1,'text'],
source4 = [1,'text',3],
source5 = ['text1','text2'],
source6 = [];
function isAllTrue(src, fltr) {
if (src.length == 0) {
throw new Error('Массив пустой');
}
let result = true;
for (let i = 0; i < src.length; i++) {
if (fltr(src[i]) != true) {
result = false;
}
}
return result;
}
function filterFn(arg) {
return typeof arg === 'number';
}
try {
let res = isAllTrue(source6, filterFn);
console.log('%s %s', 'Задача №1: ', res);
} catch(e) {
console.error('%s %s', 'Задача №1: ', e.message);
}
Задача #2
Условие
Написать функцию 'isSomeTrue', которая принимает 2 параметра - 'source' и 'filterFn', где 'source' - массив, 'filterFn' - фильтрующая функция
Если фильтрующая функция вернет 'false' для ВСЕХ элементов массива, то и сама 'isSomeTrue' вернет 'false'
Если фильтрующая функция вернет 'true' хотя бы для одного элемента массива, то и сама 'isSomeTrue' вернет 'true'
Всё должно быть реализовано с использованием чистого js (не используя сторонние библиотеки)
Так же, нельзя использовать функции для работы с массивами
Решение
let source1 = [1,2,3],
source2 = ['text',2],
source3 = [1,'text'],
source4 = [1,'text',3],
source5 = ['text1','text2'];
function isAllTrue(src, fltr) {
let result;
for (let i = 0; i < src.length; i++) {
if (fltr(src[i]) == true) {
result = true;
return result;
} else {
result = false;
}
}
return result;
}
function filterFn(arg) {
return typeof arg === 'number';
}
let res = isAllTrue(source5, filterFn);
console.log('%s %s', 'Задача №2: ', res);
Задача №3
Условие
Написать функцию 'calculator' (в виде модуля), которая имеет один параметр - 'firstNumber', где 'firstNumber' - это число, с которым будут производиться действия
Функция 'calculator' должна возвращать объект, у которого должно быть несколько функций
- 'sum' - складывает 'firstNumber' с переданными аргументами
- 'dif' - вычитает из 'firstNumber' переданные аргументы
- 'div' - делит 'firstNumber' на первый переданный аргумент. Результат этой операции делится на второй переданный аргумент (если он есть) и так далее
- 'mul' - умножает 'firstNumber' на первый переданный аргумент. Результат этой операции умножается на второй переданный аргумент (если он есть) и так далее
Каждая из этих функций принимает неограниченное количество аргументов и производит какие-то арифметические операции с этими аргументами и тем числом, которое было передано в 'calculator' и возвращает результат
Предусмотреть исключительные ситуации, для функции 'div', когда делитель равен нулю
Пример
let myCalculator = calculator(100);
console.log(myCalculator.sum(1, 2, 3)); //вернет 106
console.log(myCalculator.dif(10, 20)); //вернет 70
console.log(myCalculator.div(2, 2)); //вернет 25
console.log(myCalculator.mul(2, 2)); //вернет 400
Решение
Файл
calculator.js
let calc = function calculator(firstNumber) {
let result = firstNumber;
let obj = {
sum: function() {
for(let i = 0; i < arguments.length; i++) {
result += arguments[i];
}
return result;
},
dif: function() {
for(let i = 0; i < arguments.length; i++) {
console.log(result);
result -= arguments[i];
}
return result;
},
div: function() {
for(let i = 0; i < arguments.length; i++) {
if (arguments[i] == 0) {
throw new Error('Делитель равен нулю');
} else {
result /= arguments[i];
}
}
return result;
},
mul: function() {
for(let i = 0; i < arguments.length; i++) {
result *= arguments[i];
}
return result;
},
}
return obj;
}
module.exports = calc;
Файл
script.js
let calcFn = require('./calculator.js');
let myCalc = calcFn(8);
console.log('%s %s', 'Задача №3: ', myCalc.sum(3, 2, 0));
console.log('%s %s', 'Задача №3: ', myCalc.dif(3, 2, 0));
try {
console.log('%s %s', 'Задача №3: ', myCalc.div(3, 2, 0));
} catch(e) {
console.error('%s %s', 'Задача №3: ', e.message);
}
console.log('%s %s', 'Задача №3: ', myCalc.mul(3, 2, 0));