objectProperties.ts 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. /**
  2. * @category Services/utils
  3. * @class ObjectProperties
  4. * Classe aidant à manipuler des Objets
  5. */
  6. import { AnyJson } from '~/types/interfaces'
  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((values: AnyJson, name: string) => {
  22. if (!object.hasOwnProperty(name)) { return values }
  23. if (this.isObject(object[name])) {
  24. if (!excludedProperties.includes(name)) {
  25. const flatObject = this.cloneAndFlatten(object[name])
  26. Object.keys(flatObject).forEach((flatObjectKey) => {
  27. if (!flatObject.hasOwnProperty(flatObjectKey)) { return }
  28. values[name + '.' + flatObjectKey] = flatObject[flatObjectKey]
  29. })
  30. } else {
  31. values[name] = this.clone(object[name])
  32. }
  33. } else {
  34. values[name] = object[name]
  35. }
  36. return values
  37. }, {})
  38. };
  39. /**
  40. * Trasnforme un objet flattened en un objet nested. L'objet passé en paramètre reste inchangé
  41. * @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 } } }
  42. * @param {AnyJson} object
  43. * @return {AnyJson}
  44. */
  45. cloneAndNest (object:AnyJson):AnyJson {
  46. if (typeof object !== 'object') {
  47. throw new TypeError('Expecting an object parameter')
  48. }
  49. return Object.keys(object).reduce((values, name) => {
  50. if (!object.hasOwnProperty(name)) { return values }
  51. name.split('.').reduce((previous: AnyJson, current: string, index: number, list: Array<string>) => {
  52. if (previous != null) {
  53. if (typeof previous[current] === 'undefined') { previous[current] = {} }
  54. if (index < (list.length - 1)) {
  55. return previous[current]
  56. };
  57. previous[current] = object[name]
  58. }
  59. }, values)
  60. return values
  61. }, {})
  62. }
  63. /**
  64. * Test si le paramètre est un objet
  65. * @param {AnyJson} value
  66. * @return {boolean}
  67. */
  68. isObject (value:any):boolean {
  69. if (value === null) { return false }
  70. if (typeof value !== 'object') { return false }
  71. if (Array.isArray(value)) { return false }
  72. if (Object.prototype.toString.call(value) === '[object Date]') { return false }
  73. return true
  74. }
  75. /**
  76. * Clone l'objet et ces propriétés.
  77. * @param {Object} object
  78. * @return {Object}
  79. */
  80. clone (object: AnyJson): AnyJson {
  81. return Object.keys(object).reduce((values: AnyJson, name: string) => {
  82. if (object.hasOwnProperty(name)) {
  83. values[name] = object[name]
  84. }
  85. return values
  86. }, {})
  87. }
  88. /**
  89. * Tri un objet par rapport à ses clés (par ordre alpha)
  90. * @example sortObjectByKey({b:1, d:2, c:3, a:4}) => {a:4, b:1, c:3, d:2}
  91. * @param toSort
  92. */
  93. sortObjectByKey (toSort:any): any {
  94. if (typeof toSort !== 'object') {
  95. throw new TypeError('Expecting an object parameter')
  96. }
  97. return Object.keys(toSort).sort().reduce(
  98. (obj:any, key:string) => {
  99. obj[key] = toSort[key]
  100. return obj
  101. },
  102. {}
  103. )
  104. }
  105. }
  106. export const $objectProperties = new ObjectProperties()