objectProperties.ts 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. import { AnyJson } from '~/types/interfaces'
  2. /**
  3. * @category Services/utils
  4. * @class ObjectProperties
  5. * Classe aidant à manipuler des Objets
  6. */
  7. class ObjectProperties {
  8. /**
  9. * Flatten un objet nested en un objet avec un seul niveau avec des noms de propriétés transformées comme cela 'foo.bar'
  10. * L'objet passé en paramètre reste inchangé car il est cloné
  11. * @example cloneAndFlatten({ a: 1, b: { c: 2 }, d: { e: 3, f: { g: 4, h: 5 } }, i: { j: 6 } }, ['i']) => { a: 1, 'b.c': 2, 'd.e': 3, 'd.f.g': 4, 'd.f.h': 5, i: { j: 6 } } }
  12. * @param {AnyJson} object
  13. * @param {Array<string>} excludedProperties
  14. * @param excludedProperties
  15. * @return {AnyJson}
  16. */
  17. cloneAndFlatten (object: AnyJson, excludedProperties: Array<string> = []): AnyJson {
  18. if (typeof object !== 'object') {
  19. throw new TypeError('Expecting an object parameter')
  20. }
  21. return Object.keys(object).reduce(
  22. (values: AnyJson, name: string) => {
  23. if (!object.hasOwnProperty(name)) {
  24. return values
  25. }
  26. if (this.isObject(object[name])) {
  27. if (!excludedProperties.includes(name)) {
  28. const flatObject = this.cloneAndFlatten(object[name])
  29. Object.keys(flatObject).forEach((flatObjectKey) => {
  30. if (!flatObject.hasOwnProperty(flatObjectKey)) { return }
  31. values[name + '.' + flatObjectKey] = flatObject[flatObjectKey]
  32. })
  33. } else {
  34. values[name] = this.clone(object[name])
  35. }
  36. } else {
  37. values[name] = object[name]
  38. }
  39. return values
  40. }, {}
  41. )
  42. };
  43. /**
  44. * Transforme un objet flattened en un objet nested. L'objet passé en paramètre reste inchangé
  45. * @example cloneAndNest({ a: 1, 'b.c': 2, 'd.e': 3, 'd.f.g': 4, 'd.f.h': 5 } ) => { a: 1, b: { c: 2 }, d: { e: 3, f: { g: 4, h: 5 } } }
  46. * @param {AnyJson} object
  47. * @return {AnyJson}
  48. */
  49. cloneAndNest (object: AnyJson): AnyJson {
  50. if (typeof object !== 'object') {
  51. throw new TypeError('Expecting an object parameter')
  52. }
  53. return Object.keys(object).reduce((values, name) => {
  54. if (!object.hasOwnProperty(name)) {
  55. return values
  56. }
  57. name.split('.').reduce((previous: AnyJson, current: string, index: number, list: Array<string>) => {
  58. if (previous != null) {
  59. if (typeof previous[current] === 'undefined') {
  60. previous[current] = {}
  61. }
  62. if (index < (list.length - 1)) {
  63. return previous[current]
  64. }
  65. previous[current] = object[name]
  66. }
  67. }, values)
  68. return values
  69. }, {})
  70. }
  71. /**
  72. * Teste si le paramètre est un objet
  73. * @param {AnyJson} value
  74. * @return {boolean}
  75. */
  76. isObject (value: any): boolean {
  77. return value !== null &&
  78. typeof value === 'object' &&
  79. !Array.isArray(value) &&
  80. Object.prototype.toString.call(value) !== '[object Date]'
  81. }
  82. /**
  83. * Clône l'objet et ses propriétés.
  84. * @param {Object} object
  85. * @return {Object}
  86. */
  87. clone (object: AnyJson): AnyJson {
  88. return Object.keys(object).reduce((values: AnyJson, name: string) => {
  89. if (object.hasOwnProperty(name)) {
  90. values[name] = object[name]
  91. }
  92. return values
  93. }, {})
  94. }
  95. /**
  96. * Tri un objet par rapport à ses clés (par ordre alpha)
  97. * @example sortObjectByKey({b:1, d:2, c:3, a:4}) => {a:4, b:1, c:3, d:2}
  98. * @param toSort
  99. */
  100. sortObjectByKey (toSort: any): any {
  101. if (typeof toSort !== 'object') {
  102. throw new TypeError('Expecting an object parameter')
  103. }
  104. return Object.keys(toSort).sort().reduce(
  105. (obj:any, key:string) => {
  106. obj[key] = toSort[key]
  107. return obj
  108. },
  109. {}
  110. )
  111. }
  112. }
  113. export const $objectProperties = new ObjectProperties()