index.js 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. "use strict";
  2. ///<reference path="index.d.ts"/>
  3. var _a;
  4. var extendFuncs = {
  5. remove: function (filter) {
  6. if (typeof (filter) == 'function') {
  7. for (var i = this.length - 1; i > -1; --i) {
  8. filter(this[i], i, this) && this.splice(i, 1);
  9. }
  10. }
  11. else {
  12. for (var i = this.length - 1; i > -1; --i) {
  13. this[i] === filter && this.splice(i, 1);
  14. }
  15. }
  16. return this;
  17. },
  18. removeOne: function (filter) {
  19. if (typeof (filter) == 'function') {
  20. for (var i = 0; i < this.length; ++i) {
  21. if (filter(this[i], i, this)) {
  22. this.splice(i, 1);
  23. return this;
  24. }
  25. }
  26. }
  27. else {
  28. for (var i = 0; i < this.length; ++i) {
  29. if (this[i] === filter) {
  30. this.splice(i, 1);
  31. return this;
  32. }
  33. }
  34. }
  35. return this;
  36. },
  37. first: function () {
  38. return this.length ? this[0] : null;
  39. },
  40. last: function () {
  41. return this.length ? this[this.length - 1] : null;
  42. },
  43. max: function (mapper) {
  44. if (!this.length) {
  45. return null;
  46. }
  47. if (typeof (mapper) == 'function') {
  48. var max = mapper(this[0], 0, this);
  49. for (var i = 1; i < this.length; ++i) {
  50. var temp = mapper(this[i], i, this);
  51. max = temp > max ? temp : max;
  52. }
  53. return max;
  54. }
  55. else {
  56. return this.reduce(function (prev, cur) { return prev > cur ? prev : cur; });
  57. }
  58. },
  59. min: function (mapper) {
  60. if (!this.length) {
  61. return null;
  62. }
  63. function _min(a, b) {
  64. return a < b ? a : b;
  65. }
  66. if (typeof (mapper) == 'function') {
  67. var min = mapper(this[0], 0, this);
  68. for (var i = 1; i < this.length; ++i) {
  69. var temp = mapper(this[i], i, this);
  70. min = temp < min ? temp : min;
  71. }
  72. return min;
  73. }
  74. else {
  75. return this.reduce(function (prev, cur) { return _min(prev, cur); });
  76. }
  77. },
  78. distinct: function () {
  79. return this.filter(function (v, i, arr) { return arr.indexOf(v) === i; });
  80. },
  81. filterIndex: function (filter) {
  82. var output = [];
  83. for (var i = 0; i < this.length; ++i) {
  84. if (filter(this[i], i, this)) {
  85. output.push(i);
  86. }
  87. }
  88. return output;
  89. },
  90. count: function (filter) {
  91. var result = 0;
  92. for (var i = 0; i < this.length; ++i) {
  93. if (filter(this[i], i, this)) {
  94. ++result;
  95. }
  96. }
  97. return result;
  98. },
  99. sum: function (mapper) {
  100. var result = 0;
  101. for (var i = 0; i < this.length; ++i) {
  102. result += mapper ? mapper(this[i], i, this) : this[i];
  103. }
  104. return result;
  105. },
  106. average: function (mapper) {
  107. return this.sum(mapper) / this.length;
  108. },
  109. orderBy: function () {
  110. var mappers = [];
  111. for (var _i = 0; _i < arguments.length; _i++) {
  112. mappers[_i] = arguments[_i];
  113. }
  114. return this.slice().sort(function (a, b) {
  115. for (var i = 0; i < mappers.length; ++i) {
  116. var va = mappers[i](a);
  117. var vb = mappers[i](b);
  118. if (va > vb) {
  119. return 1;
  120. }
  121. else if (va < vb) {
  122. return -1;
  123. }
  124. }
  125. return 0;
  126. });
  127. },
  128. orderByDesc: function () {
  129. var mappers = [];
  130. for (var _i = 0; _i < arguments.length; _i++) {
  131. mappers[_i] = arguments[_i];
  132. }
  133. return this.slice().sort(function (a, b) {
  134. for (var i = 0; i < mappers.length; ++i) {
  135. var va = mappers[i](a);
  136. var vb = mappers[i](b);
  137. if (va > vb) {
  138. return -1;
  139. }
  140. else if (va < vb) {
  141. return 1;
  142. }
  143. }
  144. return 0;
  145. });
  146. },
  147. binarySearch: function (value, keyMapper) {
  148. var low = 0, high = this.length - 1;
  149. while (low <= high) {
  150. var mid = ((high + low) / 2) | 0;
  151. var midValue = keyMapper ? keyMapper(this[mid]) : this[mid];
  152. if (value === midValue) {
  153. return mid;
  154. }
  155. else if (value > midValue) {
  156. low = mid + 1;
  157. }
  158. else if (value < midValue) {
  159. high = mid - 1;
  160. }
  161. }
  162. return -1;
  163. },
  164. binaryInsert: function (item, keyMapper, unique) {
  165. if (typeof (keyMapper) == 'boolean') {
  166. unique = keyMapper;
  167. keyMapper = undefined;
  168. }
  169. var low = 0, high = this.length - 1;
  170. var mid = NaN;
  171. var itemValue = keyMapper ? keyMapper(item) : item;
  172. while (low <= high) {
  173. mid = ((high + low) / 2) | 0;
  174. var midValue = keyMapper ? keyMapper(this[mid]) : this[mid];
  175. if (itemValue === midValue) {
  176. if (unique) {
  177. return mid;
  178. }
  179. else {
  180. break;
  181. }
  182. }
  183. else if (itemValue > midValue) {
  184. low = mid + 1;
  185. }
  186. else if (itemValue < midValue) {
  187. high = mid - 1;
  188. }
  189. }
  190. var index = low > mid ? mid + 1 : mid;
  191. this.splice(index, 0, item);
  192. return index;
  193. },
  194. binaryDistinct: function (keyMapper) {
  195. return this.filter(function (v, i, arr) { return arr.binarySearch(v, keyMapper) === i; });
  196. },
  197. findLast: function (predicate) {
  198. for (var i = this.length - 1; i > -1; --i) {
  199. if (predicate(this[i], i, this)) {
  200. return this[i];
  201. }
  202. }
  203. return undefined;
  204. },
  205. findLastIndex: function (predicate) {
  206. for (var i = this.length - 1; i > -1; --i) {
  207. if (predicate(this[i], i, this)) {
  208. return i;
  209. }
  210. }
  211. return -1;
  212. },
  213. groupBy: function (grouper) {
  214. var group = this.reduce(function (prev, next) {
  215. var groupKey = grouper(next);
  216. if (!prev[groupKey]) {
  217. prev[groupKey] = [];
  218. }
  219. prev[groupKey].push(next);
  220. return prev;
  221. }, {});
  222. return Object.keys(group).map(function (key) {
  223. var arr = group[key];
  224. arr.key = key;
  225. return arr;
  226. });
  227. },
  228. __k8w_extended: {
  229. value: true
  230. }
  231. };
  232. if (!Array.prototype.__k8w_extended) {
  233. for (var key in extendFuncs) {
  234. Object.defineProperties(Array.prototype, (_a = {},
  235. _a[key] = {
  236. value: extendFuncs[key],
  237. writable: true
  238. },
  239. _a));
  240. }
  241. }