array.js 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. /**
  2. * @description
  3. * Создает массив элементов, разбитых на группы длиной `size`.
  4. * Если массив не может быть разделен равномерно, последним фрагментом будут оставшиеся элементы.
  5. *
  6. * @source https://github.com/lodash/lodash/blob/4.17.15/lodash.js#L6839
  7. * @source https://github.com/DustFoundation/utils/blob/main/src/functions/chunk.ts
  8. *
  9. * @template T
  10. * @param {T[]} array
  11. * @param {number} size
  12. * @returns {T[][]}
  13. *
  14. * @example
  15. *
  16. * chunk(['a', 'b', 'c', 'd'], 2);
  17. * // [['a', 'b'], ['c', 'd']]
  18. *
  19. * chunk(['a', 'b', 'c', 'd'], 3);
  20. * // [['a', 'b', 'c'], ['d']]
  21. *
  22. */
  23. function chunk(array, size) {
  24. if (size < 1) throw new Error("Chunk size cannot be less than 1!");
  25. return Array.from({ length: Math.ceil(array.length / size) }, (_, index) =>
  26. array.slice(index * size, index * size + size)
  27. );
  28. }
  29. /**
  30. * @description
  31. * Создает версию массива без дубликатов, используя === для проверки равенства объектов.
  32. * В частности, сохраняется только первое вхождение каждого значения.
  33. * Если вы хотите вычислить уникальные элементы на основе преобразования, передайте итерируемую функцию.
  34. *
  35. * @source https://github.com/lodash/lodash/blob/4.17.15/lodash.js#L8417
  36. * @source https://github.com/jashkenas/underscore/blob/master/modules/uniq.js
  37. *
  38. * @template T
  39. * @param {T[]} array
  40. * @param {Function} iteratee
  41. * @returns {T[]}
  42. */
  43. function uniq(array, iteratee) {
  44. const result = [];
  45. const tmp = [];
  46. array.forEach((val) => {
  47. const computed = iteratee ? iteratee(val) : val;
  48. !tmp.includes(computed) && (tmp.push(computed), result.push(val));
  49. });
  50. return result;
  51. }
  52. /**
  53. * @description
  54. * Возвращает копию списка с удаленными всеми ложными значениями.
  55. * В JavaScript значения `false`, `null`, `0`, `""`, `undefined` и `NaN` являются ложными.
  56. *
  57. * @source https://github.com/lodash/lodash/blob/4.17.15/lodash.js#L6874
  58. * @source https://github.com/jashkenas/underscore/blob/master/modules/compact.js
  59. *
  60. * @template T
  61. * @param {T[]} array
  62. * @returns {T[]}
  63. *
  64. * @example
  65. *
  66. * compact([0, 1, false, 2, '', 3]);
  67. * // [1, 2, 3]
  68. */
  69. function compact(array) {
  70. return array.filter((val) => val);
  71. }
  72. /**
  73. * @description
  74. * Вычисляет сумму значений в массиве.
  75. *
  76. * @param {number[]} array
  77. * @returns {number}
  78. *
  79. * @example
  80. *
  81. * sum([4, 2, 8, 6]);
  82. * // 20
  83. */
  84. function sum(array) {
  85. return array.reduce((prev, val) => prev + val, 0);
  86. }
  87. module.exports = { chunk, uniq, compact, sum };