Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
147 changes: 91 additions & 56 deletions lego.js
Original file line number Diff line number Diff line change
@@ -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;
};
Expand Down