Показать сообщение отдельно
  #1 (permalink)  
Старый 02.11.2016, 12:45
Аватар для spo
spo spo вне форума
Профессор
Отправить личное сообщение для spo Посмотреть профиль Найти все сообщения от spo
 
Регистрация: 11.05.2011
Сообщений: 213

Задачи по js
Здравствуйте, друзья.
Прошу проверить, выполненные мной задачи по 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));
Ответить с цитированием