From 0680e47d4dfdadd6a623e6a54f2f0aeba155878e Mon Sep 17 00:00:00 2001 From: Natalia Makishvili Date: Mon, 8 Feb 2016 00:40:05 +0300 Subject: [PATCH 1/7] Natalia Makishvili --- index.js | 32 ++++++++++++++------------- lego.js | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 78 insertions(+), 20 deletions(-) diff --git a/index.js b/index.js index c18b9c3..7ff5f66 100644 --- a/index.js +++ b/index.js @@ -29,21 +29,23 @@ var result = lego.query( // На дачу влезет примерно 10 человек lego.limit(10) ); +console.log(result); -// Будет круто организовать две вечеринки сразу: яблочную для девушек и картофельную для парней. -var result = lego.query( - phoneBook, +// Будет круто организовать две вечеринки сразу: яблочную для девушек и картофельную для парней. - // Выбираем всех парней, которые любят картофель, и всех девушек, которые любят яблоки - lego.or( - lego.and( - lego.filterEqual('gender', 'Мужской'), - lego.filterIn('favoriteFruit', ['Картофель']) - ), - lego.and( - lego.filterEqual('gender', 'Женский'), - lego.filterIn('favoriteFruit', ['Яблоко']) - ) - ) -); +//var result = lego.query( +// phoneBook, +// +// // Выбираем всех парней, которые любят картофель, и всех девушек, которые любят яблоки +// lego.or( +// lego.and( +// lego.filterEqual('gender', 'Мужской'), +// lego.filterIn('favoriteFruit', ['Картофель']) +// ), +// lego.and( +// lego.filterEqual('gender', 'Женский'), +// lego.filterIn('favoriteFruit', ['Яблоко']) +// ) +// ) +//); diff --git a/lego.js b/lego.js index 12bbfd1..514e1e7 100644 --- a/lego.js +++ b/lego.js @@ -1,8 +1,14 @@ 'use strict'; // Метод, который будет выполнять операции над коллекцией один за другим -module.exports.query = function (collection /* операторы через запятую */) { +module.exports.query = function () { + var collection = arguments[0]; + for (var i = 1; i < arguments.length; i++) { + collection = arguments[i](collection); + } + + return collection; }; // Оператор reverse, который переворачивает коллекцию @@ -15,13 +21,63 @@ module.exports.reverse = function () { }; }; +// Оператор select, который выбирает только нужные поля +module.exports.select = function () { + var args = arguments; + + return function (collection) { + return collection.map(function (item) { + var changedItem = {}; + + for (var i = 0; i < args.length; i++) { + var fieldName = args[i]; + changedItem[fieldName] = item[fieldName]; + } + + return changedItem; + }); + } +}; + +// Обязательно выбираем тех, кто любит Яблоки и Картофель (самое важное !!!) +module.exports.filterIn = function (field, type) { + return function (collection) { + return collection.filter(function(item){ + return type.indexOf(item[field]) !== -1; + }); + }; +}; + +// Отсортируем их по возрасту +module.exports.sortBy = function (field, type) { + return function (collection) { + return collection.sort(function (a, b) { + var result = Number(a[field]) - Number(b[field]); + return type === 'desc' ? -result : result; + }); + } +}; + +// А пол выведем только первой буквой для удобства +module.exports.format = function (field, fn) { + return function (collection) { + return collection.map(function (item) { + item[field] = fn(item[field]); + + return item; + }) + }; +}; + // Оператор limit, который выбирает первые N записей module.exports.limit = function (n) { - // Магия + return function (collection) { + return collection.filter(function(item, i){ + return i < n; + }); + }; }; -// Вам необходимо реализовать остальные операторы: -// select, filterIn, filterEqual, sortBy, format, limit - // Будет круто, если реализуете операторы: // or и and +//реализую в следующем PR From fd12275805250055a7e4a74679b78e3c249a77a8 Mon Sep 17 00:00:00 2001 From: natamaki Date: Thu, 11 Feb 2016 23:05:27 +0300 Subject: [PATCH 2/7] Update index.js --- index.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/index.js b/index.js index 7ff5f66..320441f 100644 --- a/index.js +++ b/index.js @@ -21,6 +21,9 @@ var result = lego.query( // Отсортируем их по возрасту (но зачем?) lego.sortBy('age', 'asc'), // Бывает только asc (от меньшего к большему) или desc (наоборот) + // Выбираем представителей одного пола + lego.filterEqual('gender', 'Женский'), + // А пол выведем только первой буквой для удобства lego.format('gender', function (value) { return value[0]; From 888bfb9932c5375379f118a208c552efa84dff16 Mon Sep 17 00:00:00 2001 From: natamaki Date: Thu, 11 Feb 2016 23:06:16 +0300 Subject: [PATCH 3/7] Update lego.js --- lego.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lego.js b/lego.js index 514e1e7..5ffb2c1 100644 --- a/lego.js +++ b/lego.js @@ -58,6 +58,15 @@ module.exports.sortBy = function (field, type) { } }; +// возвращает коллекцию, в которое поле (аргумент 1), равно значению (аргумент 2) +module.exports.filterEqual = function (field, type) { + return function (collection) { + return collection.filter(function(item){ + return item[field] === type; + }); + }; +}; + // А пол выведем только первой буквой для удобства module.exports.format = function (field, fn) { return function (collection) { From 1197b8e70cd6c5f5411e0ca55742d1d8f317bc9e Mon Sep 17 00:00:00 2001 From: natamaki Date: Mon, 15 Feb 2016 00:25:18 +0300 Subject: [PATCH 4/7] Update lego.js --- lego.js | 89 +++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 70 insertions(+), 19 deletions(-) diff --git a/lego.js b/lego.js index 5ffb2c1..52a6123 100644 --- a/lego.js +++ b/lego.js @@ -2,16 +2,22 @@ // Метод, который будет выполнять операции над коллекцией один за другим module.exports.query = function () { - var collection = arguments[0]; + var args = [].slice.call(arguments); + var collection = args[0]; - for (var i = 1; i < arguments.length; i++) { - collection = arguments[i](collection); - } + args.splice(0, 1); + + var changedCollection = args.reduce(function (changedCollection, method) { + return method(changedCollection); + }, collection); - return collection; + return changedCollection; }; -// Оператор reverse, который переворачивает коллекцию +/** + * Возвращает функцию, которая возвращает новую коллекцию, с обратным порядком + * @returns {Function} + */ module.exports.reverse = function () { return function (collection) { var changedCollection = collection.reverse(); @@ -21,7 +27,11 @@ module.exports.reverse = function () { }; }; -// Оператор select, который выбирает только нужные поля +/** + * Возвращает функцию, которая возвращает новую коллекцию, содержащую только заданные поля + * @param {Object} arguments аргументы функции + * @returns {Function} + */ module.exports.select = function () { var args = arguments; @@ -39,7 +49,13 @@ module.exports.select = function () { } }; -// Обязательно выбираем тех, кто любит Яблоки и Картофель (самое важное !!!) +/** + * Возвращает функцию, которая при вызове возвращает новую коллекцию, + * в которой поле c именем field содержит значение, встречающееся в массиве type + * @param {String} field + * @param {String[]} type + * @returns {Function} + */ module.exports.filterIn = function (field, type) { return function (collection) { return collection.filter(function(item){ @@ -48,17 +64,44 @@ module.exports.filterIn = function (field, type) { }; }; -// Отсортируем их по возрасту +/** + * Возвращает функцию, которая при вызове возвращает новую коллекцию, + * которая сортирует коллекцию по значеню в переданном поле + * @param {String} field имя поля по которому сортируем + * @param {String} type порядок сортировки, может быть asc или desc + * @returns {Function} + */ module.exports.sortBy = function (field, type) { return function (collection) { - return collection.sort(function (a, b) { - var result = Number(a[field]) - Number(b[field]); - return type === 'desc' ? -result : result; - }); + return collection.sort(compareNumbers.bind(this, field, type)); } }; -// возвращает коллекцию, в которое поле (аргумент 1), равно значению (аргумент 2) +/** + * Сравнивает числа + * @param {Object} arguments аргументы функции + * @param {String} arguments[0] имя поля по которому сортируем + * @param {String} arguments[1] порядок сортировки + * @param {Object} arguments[2] 1 объект сравнения + * @param {Object} arguments[3] 2 объект сравнения + * @returns {Number} -1|0|1 + */ +function compareNumbers () { + var field = arguments[0]; + var type = arguments[1]; + var a = arguments[2]; + var b = arguments[3]; + var result = Number(a[field]) - Number(b[field]); + return type === 'desc' ? -result : result; +} + +/** + * Возвращает функцию, которая при вызове возвращает новую коллекцию, + * в которой поле (аргумент 1), равно значению (аргумент 2) + * @param {String} field + * @param {String} type + * @returns {Function} + */ module.exports.filterEqual = function (field, type) { return function (collection) { return collection.filter(function(item){ @@ -67,7 +110,13 @@ module.exports.filterEqual = function (field, type) { }; }; -// А пол выведем только первой буквой для удобства +/** + * Возвращает функцию, которая при вызове возвращает новую коллекцию, + * с отформатированным значением поля при помощи переданной функции + * @param {String} field + * @param {Function} fn + * @returns {Function} + */ module.exports.format = function (field, fn) { return function (collection) { return collection.map(function (item) { @@ -78,12 +127,14 @@ module.exports.format = function (field, fn) { }; }; -// Оператор limit, который выбирает первые N записей +/** + * Возвращает функцию, которая при вызове возвращает новую коллекцию с первыми N записями + * @param {Number} n + * @returns {Function} + */ module.exports.limit = function (n) { return function (collection) { - return collection.filter(function(item, i){ - return i < n; - }); + return collection.slice(0, n); }; }; From d0bb115ef36fd014f2eb0b863d4f8c76a13206af Mon Sep 17 00:00:00 2001 From: natamaki Date: Mon, 15 Feb 2016 00:27:37 +0300 Subject: [PATCH 5/7] Update lego.js From 430a8fedaae7a2c5294a875dda740f9f4b46706f Mon Sep 17 00:00:00 2001 From: natamaki Date: Wed, 24 Feb 2016 18:37:42 +0300 Subject: [PATCH 6/7] Update lego.js --- lego.js | 89 ++++++++++++--------------------------------------------- 1 file changed, 19 insertions(+), 70 deletions(-) diff --git a/lego.js b/lego.js index 52a6123..5ffb2c1 100644 --- a/lego.js +++ b/lego.js @@ -2,22 +2,16 @@ // Метод, который будет выполнять операции над коллекцией один за другим module.exports.query = function () { - var args = [].slice.call(arguments); - var collection = args[0]; + var collection = arguments[0]; - args.splice(0, 1); - - var changedCollection = args.reduce(function (changedCollection, method) { - return method(changedCollection); - }, collection); + for (var i = 1; i < arguments.length; i++) { + collection = arguments[i](collection); + } - return changedCollection; + return collection; }; -/** - * Возвращает функцию, которая возвращает новую коллекцию, с обратным порядком - * @returns {Function} - */ +// Оператор reverse, который переворачивает коллекцию module.exports.reverse = function () { return function (collection) { var changedCollection = collection.reverse(); @@ -27,11 +21,7 @@ module.exports.reverse = function () { }; }; -/** - * Возвращает функцию, которая возвращает новую коллекцию, содержащую только заданные поля - * @param {Object} arguments аргументы функции - * @returns {Function} - */ +// Оператор select, который выбирает только нужные поля module.exports.select = function () { var args = arguments; @@ -49,13 +39,7 @@ module.exports.select = function () { } }; -/** - * Возвращает функцию, которая при вызове возвращает новую коллекцию, - * в которой поле c именем field содержит значение, встречающееся в массиве type - * @param {String} field - * @param {String[]} type - * @returns {Function} - */ +// Обязательно выбираем тех, кто любит Яблоки и Картофель (самое важное !!!) module.exports.filterIn = function (field, type) { return function (collection) { return collection.filter(function(item){ @@ -64,44 +48,17 @@ module.exports.filterIn = function (field, type) { }; }; -/** - * Возвращает функцию, которая при вызове возвращает новую коллекцию, - * которая сортирует коллекцию по значеню в переданном поле - * @param {String} field имя поля по которому сортируем - * @param {String} type порядок сортировки, может быть asc или desc - * @returns {Function} - */ +// Отсортируем их по возрасту module.exports.sortBy = function (field, type) { return function (collection) { - return collection.sort(compareNumbers.bind(this, field, type)); + return collection.sort(function (a, b) { + var result = Number(a[field]) - Number(b[field]); + return type === 'desc' ? -result : result; + }); } }; -/** - * Сравнивает числа - * @param {Object} arguments аргументы функции - * @param {String} arguments[0] имя поля по которому сортируем - * @param {String} arguments[1] порядок сортировки - * @param {Object} arguments[2] 1 объект сравнения - * @param {Object} arguments[3] 2 объект сравнения - * @returns {Number} -1|0|1 - */ -function compareNumbers () { - var field = arguments[0]; - var type = arguments[1]; - var a = arguments[2]; - var b = arguments[3]; - var result = Number(a[field]) - Number(b[field]); - return type === 'desc' ? -result : result; -} - -/** - * Возвращает функцию, которая при вызове возвращает новую коллекцию, - * в которой поле (аргумент 1), равно значению (аргумент 2) - * @param {String} field - * @param {String} type - * @returns {Function} - */ +// возвращает коллекцию, в которое поле (аргумент 1), равно значению (аргумент 2) module.exports.filterEqual = function (field, type) { return function (collection) { return collection.filter(function(item){ @@ -110,13 +67,7 @@ module.exports.filterEqual = function (field, type) { }; }; -/** - * Возвращает функцию, которая при вызове возвращает новую коллекцию, - * с отформатированным значением поля при помощи переданной функции - * @param {String} field - * @param {Function} fn - * @returns {Function} - */ +// А пол выведем только первой буквой для удобства module.exports.format = function (field, fn) { return function (collection) { return collection.map(function (item) { @@ -127,14 +78,12 @@ module.exports.format = function (field, fn) { }; }; -/** - * Возвращает функцию, которая при вызове возвращает новую коллекцию с первыми N записями - * @param {Number} n - * @returns {Function} - */ +// Оператор limit, который выбирает первые N записей module.exports.limit = function (n) { return function (collection) { - return collection.slice(0, n); + return collection.filter(function(item, i){ + return i < n; + }); }; }; From a5c8999e127041830ed8c5e160fe85377271674f Mon Sep 17 00:00:00 2001 From: natamaki Date: Wed, 24 Feb 2016 18:40:26 +0300 Subject: [PATCH 7/7] fix --- lego.js | 83 ++++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 64 insertions(+), 19 deletions(-) diff --git a/lego.js b/lego.js index 5ffb2c1..3a8a2fc 100644 --- a/lego.js +++ b/lego.js @@ -2,16 +2,20 @@ // Метод, который будет выполнять операции над коллекцией один за другим module.exports.query = function () { - var collection = arguments[0]; + var args = [].slice.call(arguments); + var collection = args.shift(); - for (var i = 1; i < arguments.length; i++) { - collection = arguments[i](collection); - } + var changedCollection = args.reduce(function (changedCollection, method) { + return method(changedCollection); + }, collection); - return collection; + return changedCollection; }; -// Оператор reverse, который переворачивает коллекцию +/** + * Возвращает функцию, которая возвращает новую коллекцию, с обратным порядком + * @returns {Function} + */ module.exports.reverse = function () { return function (collection) { var changedCollection = collection.reverse(); @@ -21,7 +25,11 @@ module.exports.reverse = function () { }; }; -// Оператор select, который выбирает только нужные поля +/** + * Возвращает функцию, которая возвращает новую коллекцию, содержащую только заданные поля + * @param {Object} arguments аргументы функции + * @returns {Function} + */ module.exports.select = function () { var args = arguments; @@ -39,7 +47,13 @@ module.exports.select = function () { } }; -// Обязательно выбираем тех, кто любит Яблоки и Картофель (самое важное !!!) +/** + * Возвращает функцию, которая при вызове возвращает новую коллекцию, + * в которой поле c именем field содержит значение, встречающееся в массиве type + * @param {String} field + * @param {String[]} type + * @returns {Function} + */ module.exports.filterIn = function (field, type) { return function (collection) { return collection.filter(function(item){ @@ -48,17 +62,40 @@ module.exports.filterIn = function (field, type) { }; }; -// Отсортируем их по возрасту +/** + * Возвращает функцию, которая при вызове возвращает новую коллекцию, + * которая сортирует коллекцию по значеню в переданном поле + * @param {String} field имя поля по которому сортируем + * @param {String} type порядок сортировки, может быть asc или desc + * @returns {Function} + */ module.exports.sortBy = function (field, type) { return function (collection) { - return collection.sort(function (a, b) { - var result = Number(a[field]) - Number(b[field]); - return type === 'desc' ? -result : result; - }); + return collection.sort(compareNumbers.bind(this, field, type)); } }; -// возвращает коллекцию, в которое поле (аргумент 1), равно значению (аргумент 2) +/** + * Сравнивает числа + * @param {Object} arguments аргументы функции + * @param {String} field имя поля по которому сортируем + * @param {String} type порядок сортировки + * @param {Object} a 1 объект сравнения + * @param {Object} b 2 объект сравнения + * @returns {Number} -1|0|1 + */ +function compareNumbers (field, type, a, b) { + var result = Number(a[field]) - Number(b[field]); + return type === 'desc' ? -result : result; +} + +/** + * Возвращает функцию, которая при вызове возвращает новую коллекцию, + * в которой поле (аргумент 1), равно значению (аргумент 2) + * @param {String} field + * @param {String} type + * @returns {Function} + */ module.exports.filterEqual = function (field, type) { return function (collection) { return collection.filter(function(item){ @@ -67,7 +104,13 @@ module.exports.filterEqual = function (field, type) { }; }; -// А пол выведем только первой буквой для удобства +/** + * Возвращает функцию, которая при вызове возвращает новую коллекцию, + * с отформатированным значением поля при помощи переданной функции + * @param {String} field + * @param {Function} fn + * @returns {Function} + */ module.exports.format = function (field, fn) { return function (collection) { return collection.map(function (item) { @@ -78,12 +121,14 @@ module.exports.format = function (field, fn) { }; }; -// Оператор limit, который выбирает первые N записей +/** + * Возвращает функцию, которая при вызове возвращает новую коллекцию с первыми N записями + * @param {Number} n + * @returns {Function} + */ module.exports.limit = function (n) { return function (collection) { - return collection.filter(function(item, i){ - return i < n; - }); + return collection.slice(0, n); }; };