arrayUtils.ts 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import type { AnyJson, ResourceTree, ResourceTreeContent } from '~/types/data'
  2. const ArrayUtils = {
  3. /**
  4. * Trie un tableau
  5. *
  6. * @param array
  7. * @param reverse
  8. */
  9. sort(
  10. array: Array<object | string | number>,
  11. reverse: boolean = false,
  12. ): Array<object | string | number> {
  13. return array.sort((a, b) => {
  14. return (a < b ? -1 : a > b ? 1 : 0) * (reverse ? -1 : 1)
  15. })
  16. },
  17. /**
  18. * Trie un tableau d'objets selon une propriété commune
  19. *
  20. * @param array Une array d'objets
  21. * @param property Le nom d'une propriété possédée par tous les objets
  22. * @param reverse
  23. */
  24. sortObjectsByProp<T extends AnyJson>(
  25. array: Array<T>,
  26. property: string,
  27. reverse: boolean = false,
  28. ): Array<T> {
  29. return array.sort((a: T, b: T) => {
  30. return (
  31. (a[property] < b[property] ? -1 : a[property] > b[property] ? 1 : 0) *
  32. (reverse ? -1 : 1)
  33. )
  34. })
  35. },
  36. /**
  37. * Sort the different levels of a resource tree's content
  38. * @param tree
  39. */
  40. sortResourceTree(tree: ResourceTreeContent): ResourceTreeContent {
  41. // Si c'est un tableau simple (premier niveau)
  42. if (Array.isArray(tree)) {
  43. return [...tree].sort()
  44. }
  45. // Si c'est un objet (deuxième ou troisième niveau)
  46. const sortedTree: Record<string, any> = {}
  47. // Trier les clés du premier niveau
  48. const sortedKeys = Object.keys(tree).sort()
  49. for (const key of sortedKeys) {
  50. const value = tree[key]
  51. // Si la valeur est un tableau (deuxième niveau)
  52. if (Array.isArray(value)) {
  53. sortedTree[key] = [...value].sort()
  54. }
  55. // Si la valeur est un objet (troisième niveau)
  56. else if (typeof value === 'object' && value !== null) {
  57. const sortedSubTree: Record<string, string[]> = {}
  58. const sortedSubKeys = Object.keys(value).sort()
  59. for (const subKey of sortedSubKeys) {
  60. const subValue = value[subKey]
  61. if (Array.isArray(subValue)) {
  62. sortedSubTree[subKey] = [...subValue].sort()
  63. }
  64. }
  65. sortedTree[key] = sortedSubTree
  66. }
  67. }
  68. return sortedTree
  69. },
  70. *iterate(array: Array<string> | object): Generator<string> {
  71. if (Array.isArray(array)) {
  72. for (const item of array) {
  73. yield item
  74. }
  75. } else if (typeof array === 'object') {
  76. for (const key in array) {
  77. yield key
  78. }
  79. } else {
  80. throw new Error('Invalid array or object')
  81. }
  82. }
  83. }
  84. export default ArrayUtils