objectUtils.ts 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. /**
  2. * @category Services/utils
  3. * @class ObjectUtils
  4. * Classe aidant à manipuler des Objets
  5. */
  6. import {AnyJson} from "~/types/data";
  7. export default class ObjectUtils {
  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. *
  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. *
  47. * @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 } } }
  48. * @param {AnyJson} object
  49. * @return {AnyJson}
  50. */
  51. static cloneAndNest (object: AnyJson): AnyJson {
  52. if (typeof object !== 'object') {
  53. throw new TypeError('Expecting an object parameter')
  54. }
  55. return Object.keys(object).reduce((values, name) => {
  56. if (!object.hasOwnProperty(name)) {
  57. return values
  58. }
  59. name.split('.').reduce((previous: AnyJson, current: string, index: number, list: Array<string>) => {
  60. if (previous != null) {
  61. if (typeof previous[current] === 'undefined') {
  62. previous[current] = {}
  63. }
  64. if (index < (list.length - 1)) {
  65. return previous[current]
  66. }
  67. previous[current] = object[name]
  68. }
  69. }, values)
  70. return values
  71. }, {})
  72. }
  73. /**
  74. * Teste si le paramètre est un objet
  75. *
  76. * @param {AnyJson} value
  77. * @return {boolean}
  78. */
  79. static isObject (value: any): boolean {
  80. return value !== null &&
  81. typeof value === 'object' &&
  82. !Array.isArray(value) &&
  83. ObjectUtils.prototype.toString.call(value) !== '[object Date]'
  84. }
  85. /**
  86. * Clone l'objet et ses propriétés.
  87. *
  88. * @param {ObjectUtils} object
  89. * @return {ObjectUtils}
  90. */
  91. static clone (object: AnyJson): AnyJson {
  92. return Object.keys(object).reduce((values: AnyJson, name: string) => {
  93. if (object.hasOwnProperty(name)) {
  94. values[name] = object[name]
  95. }
  96. return values
  97. }, {})
  98. }
  99. /**
  100. * Trie un objet selon ses clés (par ordre alphanumérique)
  101. *
  102. * @example sortObjectsByKey({b:1, d:2, c:3, a:4}) => {a:4, b:1, c:3, d:2}
  103. * @param toSort
  104. */
  105. static sortObjectsByKey (toSort: AnyJson): any {
  106. if (typeof toSort !== 'object') {
  107. throw new TypeError('Expecting an object parameter')
  108. }
  109. return Object.keys(toSort).sort().reduce(
  110. (obj:any, key:string) => {
  111. obj[key] = toSort[key]
  112. return obj
  113. },
  114. {}
  115. )
  116. }
  117. }