diff --git a/lego.js b/lego.js index b220745..4716ad2 100644 --- a/lego.js +++ b/lego.js @@ -1,88 +1,123 @@ 'use strict'; -/** - * Сделано задание на звездочку - * Реализованы методы or и and - */ -exports.isStar = true; - -/** - * Запрос к коллекции - * @param {Array} collection - * @params {...Function} – Функции для запроса - * @returns {Array} - */ -exports.query = function (collection) { - return collection; +exports.isStar = false; + +function compareFunctions(a, b) { + var obj = { + select: 3, + format: 2, + filterIn: 4, + sortBy: 5, + limit: 1 + }; + + return (obj[a.name] < obj[b.name]) ? 1 : -1; +} + +function filterCollection(property, values, record, result) { + for (var j = 0; j < values.length; j++) { + if (record[property] === values[j]) { + result.push(record); + } + } +} + +exports.query = function () { + var queryArgs = [].slice.call(arguments); + if (queryArgs.length === 1) { + return queryArgs[0]; + } + var changedCollection = queryArgs[0]; + + queryArgs.splice(0, 1); + queryArgs.sort(compareFunctions); + for (var i = 0; i < queryArgs.length; i++) { + changedCollection = queryArgs[i](changedCollection); + } + + return changedCollection; }; -/** - * Выбор полей - * @params {...String} - */ exports.select = function () { - return; + var args = [].slice.call(arguments); + + return function select(collection) { + var result = []; + for (var i = 0; i < collection.length; i++) { + result.push({}); + for (var j = 0; j < args.length; j++) { + result[i][args[j]] = collection[i][args[j]]; + } + } + + return result; + }; }; -/** - * Фильтрация поля по массиву значений - * @param {String} property – Свойство для фильтрации - * @param {Array} values – Доступные значения - */ exports.filterIn = function (property, values) { - console.info(property, values); - return; + return function filterIn(collection) { + var result = []; + for (var i = 0; i < collection.length; i++) { + filterCollection(property, values, collection[i], result); + } + + return result; + }; }; -/** - * Сортировка коллекции по полю - * @param {String} property – Свойство для фильтрации - * @param {String} order – Порядок сортировки (asc - по возрастанию; desc – по убыванию) - */ exports.sortBy = function (property, order) { - console.info(property, order); + return function sortBy(collection) { + collection.sort(function (a, b) { + var coefficient; + if (order === 'asc') { + coefficient = -1; + } + if (order === 'desc') { + coefficient = 1; + } + if (a[property] < b[property]) { + return Number(coefficient) * 1; + } + if (a[property] > b[property]) { + return -1 * Number(coefficient); + } + + return 0; + }); - return; + return collection; + }; }; -/** - * Форматирование поля - * @param {String} property – Свойство для фильтрации - * @param {Function} formatter – Функция для форматирования - */ exports.format = function (property, formatter) { - console.info(property, formatter); - return; + return function format(collection) { + var result = []; + for (var i = 0; i < collection.length; i++) { + var a = formatter(collection[i][property]); + collection[i][property] = a; + result.push(collection[i]); + } + + return result; + }; }; -/** - * Ограничение количества элементов в коллекции - * @param {Number} count – Максимальное количество элементов - */ exports.limit = function (count) { - console.info(count); + return function limit(collection) { + var result = collection.splice(0, count); - return; + return result; + }; }; if (exports.isStar) { - /** - * Фильтрация, объединяющая фильтрующие функции - * @star - * @params {...Function} – Фильтрующие функции - */ exports.or = function () { return; }; - /** - * Фильтрация, пересекающая фильтрующие функции - * @star - * @params {...Function} – Фильтрующие функции - */ exports.and = function () { return; };