util.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. 'use strict';
  2. exports.shuffle = array => {
  3. if (!Array.isArray(array)) throw new TypeError('array must be an Array!');
  4. const $array = array.slice();
  5. const { length } = $array;
  6. const { random, floor } = Math;
  7. for (let i = 0; i < length; i++) {
  8. // @see https://github.com/lodash/lodash/blob/4.17.10/lodash.js#L6718
  9. // @see https://github.com/lodash/lodash/blob/4.17.10/lodash.js#L3884
  10. const rand = i + floor(random() * (length - i));
  11. const temp = $array[i];
  12. $array[i] = $array[rand];
  13. $array[rand] = temp;
  14. }
  15. return $array;
  16. };
  17. function extractPropKey(key) {
  18. return key.split('.');
  19. }
  20. exports.getProp = (obj, key) => {
  21. if (typeof obj !== 'object') throw new TypeError('obj must be an object!');
  22. if (!key) throw new TypeError('key is required!');
  23. if (!key.includes('.')) {
  24. return obj[key];
  25. }
  26. const token = extractPropKey(key);
  27. let result = obj;
  28. const len = token.length;
  29. for (let i = 0; i < len; i++) {
  30. result = result[token[i]];
  31. }
  32. return result;
  33. };
  34. exports.setProp = (obj, key, value) => {
  35. if (typeof obj !== 'object') throw new TypeError('obj must be an object!');
  36. if (!key) throw new TypeError('key is required!');
  37. if (!key.includes('.')) {
  38. obj[key] = value;
  39. return;
  40. }
  41. const token = extractPropKey(key);
  42. const lastKey = token.pop();
  43. const len = token.length;
  44. let cursor = obj;
  45. for (let i = 0; i < len; i++) {
  46. const name = token[i];
  47. cursor[name] = cursor[name] || {};
  48. cursor = cursor[name];
  49. }
  50. cursor[lastKey] = value;
  51. };
  52. exports.delProp = (obj, key) => {
  53. if (typeof obj !== 'object') throw new TypeError('obj must be an object!');
  54. if (!key) throw new TypeError('key is required!');
  55. if (!key.includes('.')) {
  56. delete obj[key];
  57. return;
  58. }
  59. const token = extractPropKey(key);
  60. const lastKey = token.pop();
  61. const len = token.length;
  62. let cursor = obj;
  63. for (let i = 0; i < len; i++) {
  64. const name = token[i];
  65. if (cursor[name]) {
  66. cursor = cursor[name];
  67. } else {
  68. return;
  69. }
  70. }
  71. delete cursor[lastKey];
  72. };
  73. exports.setGetter = (obj, key, fn) => {
  74. if (typeof obj !== 'object') throw new TypeError('obj must be an object!');
  75. if (!key) throw new TypeError('key is required!');
  76. if (typeof fn !== 'function') throw new TypeError('fn must be a function!');
  77. if (!key.includes('.')) {
  78. obj.__defineGetter__(key, fn);
  79. return;
  80. }
  81. const token = extractPropKey(key);
  82. const lastKey = token.pop();
  83. const len = token.length;
  84. let cursor = obj;
  85. for (let i = 0; i < len; i++) {
  86. const name = token[i];
  87. cursor[name] = cursor[name] || {};
  88. cursor = cursor[name];
  89. }
  90. cursor.__defineGetter__(lastKey, fn);
  91. };
  92. exports.arr2obj = (arr, value) => {
  93. if (!Array.isArray(arr)) throw new TypeError('arr must be an array!');
  94. const obj = {};
  95. let i = arr.length;
  96. while (i--) {
  97. obj[arr[i]] = value;
  98. }
  99. return obj;
  100. };
  101. exports.reverse = arr => {
  102. if (!Array.isArray(arr)) throw new TypeError('arr must be an array!');
  103. const len = arr.length;
  104. if (!len) return arr;
  105. for (let left = 0, right = len - 1; left < right; left++, right--) {
  106. const tmp = arr[left];
  107. arr[left] = arr[right];
  108. arr[right] = tmp;
  109. }
  110. return arr;
  111. };
  112. function parseArgs(args) {
  113. if (typeof args !== 'string') return args;
  114. const arr = args.split(' ');
  115. const result = {};
  116. for (let i = 0, len = arr.length; i < len; i++) {
  117. const key = arr[i];
  118. switch (key[0]) {
  119. case '+':
  120. result[key.slice(1)] = 1;
  121. break;
  122. case '-':
  123. result[key.slice(1)] = -1;
  124. break;
  125. default:
  126. result[key] = 1;
  127. }
  128. }
  129. return result;
  130. }
  131. exports.parseArgs = (orderby, order) => {
  132. let result;
  133. if (order) {
  134. result = {};
  135. result[orderby] = order;
  136. } else if (typeof orderby === 'string') {
  137. result = parseArgs(orderby);
  138. } else {
  139. result = orderby;
  140. }
  141. return result;
  142. };