Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 

169 lignes
5.0 KiB

  1. module.exports = {
  2. join: function(arr, separator, prop) {
  3. if (!Array.isArray(arr)) return arr;
  4. return arr.map(item => prop ? item[prop] : item).join(separator);
  5. },
  6. first: function(arr) {
  7. if (!Array.isArray(arr)) return arr;
  8. return arr.length ? arr[0] : null;
  9. },
  10. top: function(arr, count) {
  11. if (!Array.isArray(arr)) return arr;
  12. return arr.slice(0, count);
  13. },
  14. last: function(arr, count) {
  15. if (!Array.isArray(arr)) return arr;
  16. if (count) return arr.slice(-count);
  17. return arr[arr.length - 1];
  18. },
  19. where: function(arr, prop, operator, value) {
  20. if (!Array.isArray(arr)) return arr;
  21. return arr.filter(item => {
  22. let val = item[prop];
  23. switch (operator) {
  24. case 'startsWith': return String(val).startsWith(value);
  25. case 'endsWith': return String(val).endsWith(value);
  26. case 'contains': return String(val).includes(value);
  27. case '===': return val === value;
  28. case '!==': return val !== value;
  29. case '==': return val == value;
  30. case '!=': return val != value;
  31. case '<=': return val <= value;
  32. case '>=': return val >= value;
  33. case '<': return val < value;
  34. case '>': return val > value;
  35. };
  36. return true;
  37. });
  38. },
  39. unique: function(arr, prop) {
  40. if (!Array.isArray(arr)) return arr;
  41. if (prop) arr = arr.map(item => item[prop]);
  42. let lookup = [];
  43. return arr.filter(item => {
  44. if (lookup.includes(item)) return false;
  45. lookup.push(item);
  46. return true;
  47. });
  48. },
  49. groupBy: function(arr, prop) {
  50. if (!Array.isArray(arr)) return arr;
  51. return arr.reduce((groups, item) => {
  52. let group = String(item[prop]);
  53. if (!groups[group]) groups[group] = [];
  54. groups[group].push(item);
  55. return groups;
  56. }, {});
  57. },
  58. sort: function(arr, prop) {
  59. if (!Array.isArray(arr)) return arr;
  60. return arr.slice(0).sort((a, b) => {
  61. a = prop ? a && a[prop] : a;
  62. b = prop ? b && b[prop] : b;
  63. if (typeof a == 'string' && typeof b == 'string') {
  64. return a.localeCompare(b);
  65. }
  66. return a < b ? -1 : a > b ? 1 : 0;
  67. });
  68. },
  69. randomize: function(arr) {
  70. if (!Array.isArray(arr)) return arr;
  71. arr = arr.slice(0);
  72. let len = arr.length;
  73. if (len) {
  74. while (--len) {
  75. let rnd = Math.floor(Math.random() * (len + 1));
  76. let val = arr[len];
  77. arr[len] = arr[rnd];
  78. arr[rnd] = val;
  79. }
  80. }
  81. return arr;
  82. },
  83. reverse: function(arr) {
  84. if (!Array.isArray(arr)) return arr;
  85. return arr.slice(0).reverse();
  86. },
  87. count: function(arr) {
  88. if (!Array.isArray(arr)) return arr;
  89. return arr.length;
  90. },
  91. min: function(arr, prop) {
  92. if (!Array.isArray(arr)) return arr;
  93. return arr.reduce((min, num) => {
  94. num = prop ? num[prop] : num;
  95. if (num == null) return min;
  96. num = Number(num);
  97. if (isNaN(num) || !isFinite(num)) return min;
  98. return min == null || num < min ? num : min;
  99. }, null);
  100. },
  101. max: function(arr, prop) {
  102. if (!Array.isArray(arr)) return arr;
  103. return arr.reduce((max, num) => {
  104. num = prop ? num[prop] : num;
  105. if (num == null) return max;
  106. num = Number(num);
  107. if (isNaN(num) || !isFinite(num)) return max;
  108. return max == null || num > max ? num : max;
  109. }, null);
  110. },
  111. sum: function(arr, prop) {
  112. if (!Array.isArray(arr)) return arr;
  113. return arr.reduce((sum, num) => {
  114. num = prop ? num[prop] : num;
  115. if (num == null) return sum;
  116. num = Number(num);
  117. if (isNaN(num) || !isFinite(num)) return sum;
  118. return sum + num;
  119. }, 0);
  120. },
  121. avg: function(arr, prop) {
  122. if (!Array.isArray(arr)) return arr;
  123. let cnt = 0;
  124. return arr.reduce((avg, num) => {
  125. num = prop ? num[prop] : num;
  126. if (num == null) return avg;
  127. num = Number(num);
  128. if (isNaN(num) || !isFinite(num)) return avg;
  129. cnt++;
  130. return avg + num;
  131. }, 0) / cnt;
  132. },
  133. flatten: function(arr, prop) {
  134. if (!Array.isArray(arr)) return arr;
  135. return arr.map(item => item[prop]);
  136. },
  137. keys: function(obj) {
  138. if (typeof obj != 'object') return obj;
  139. return Object.keys(obj);
  140. },
  141. values: function(obj) {
  142. if (typeof obj != 'object') return obj;
  143. return Object.values(obj);
  144. },
  145. };