forked from urfu-2015/javascript-tasks-3
-
Notifications
You must be signed in to change notification settings - Fork 0
/
lego.js
137 lines (120 loc) · 4.65 KB
/
lego.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
'use strict';
// Метод, который будет выполнять операции над коллекцией один за другим
module.exports.query = function () {
var args = [].slice.call(arguments);
var collection = args.shift();
var changedCollection = args.reduce(function (changedCollection, method) {
return method(changedCollection);
}, collection);
return changedCollection;
};
/**
* Возвращает функцию, которая возвращает новую коллекцию, с обратным порядком
* @returns {Function}
*/
module.exports.reverse = function () {
return function (collection) {
var changedCollection = collection.reverse();
// Возращаем изменённую коллекцию
return changedCollection;
};
};
/**
* Возвращает функцию, которая возвращает новую коллекцию, содержащую только заданные поля
* @param {Object} arguments аргументы функции
* @returns {Function}
*/
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;
});
}
};
/**
* Возвращает функцию, которая при вызове возвращает новую коллекцию,
* в которой поле 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){
return type.indexOf(item[field]) !== -1;
});
};
};
/**
* Возвращает функцию, которая при вызове возвращает новую коллекцию,
* которая сортирует коллекцию по значеню в переданном поле
* @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));
}
};
/**
* Сравнивает числа
* @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){
return item[field] === type;
});
};
};
/**
* Возвращает функцию, которая при вызове возвращает новую коллекцию,
* с отформатированным значением поля при помощи переданной функции
* @param {String} field
* @param {Function} fn
* @returns {Function}
*/
module.exports.format = function (field, fn) {
return function (collection) {
return collection.map(function (item) {
item[field] = fn(item[field]);
return item;
})
};
};
/**
* Возвращает функцию, которая при вызове возвращает новую коллекцию с первыми N записями
* @param {Number} n
* @returns {Function}
*/
module.exports.limit = function (n) {
return function (collection) {
return collection.slice(0, n);
};
};
// Будет круто, если реализуете операторы:
// or и and
//реализую в следующем PR