objectUtils.ts 3.8 KB

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