under-dash.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. "use strict";
  2. const {
  3. toString
  4. } = Object.prototype;
  5. const escapeHtmlRegex = /["&<>]/;
  6. const _ = {
  7. each: function each(obj, cb) {
  8. if (obj) {
  9. if (Array.isArray(obj)) {
  10. obj.forEach(cb);
  11. } else {
  12. Object.keys(obj).forEach(key => {
  13. cb(obj[key], key);
  14. });
  15. }
  16. }
  17. },
  18. some: function some(obj, cb) {
  19. if (obj) {
  20. if (Array.isArray(obj)) {
  21. return obj.some(cb);
  22. }
  23. return Object.keys(obj).some(key => cb(obj[key], key));
  24. }
  25. return false;
  26. },
  27. every: function every(obj, cb) {
  28. if (obj) {
  29. if (Array.isArray(obj)) {
  30. return obj.every(cb);
  31. }
  32. return Object.keys(obj).every(key => cb(obj[key], key));
  33. }
  34. return true;
  35. },
  36. map: function map(obj, cb) {
  37. if (obj) {
  38. if (Array.isArray(obj)) {
  39. return obj.map(cb);
  40. }
  41. return Object.keys(obj).map(key => cb(obj[key], key));
  42. }
  43. return [];
  44. },
  45. keyBy(a, p) {
  46. return a.reduce((o, v) => {
  47. o[v[p]] = v;
  48. return o;
  49. }, {});
  50. },
  51. isEqual: function isEqual(a, b) {
  52. const aType = typeof a;
  53. const bType = typeof b;
  54. const aArray = Array.isArray(a);
  55. const bArray = Array.isArray(b);
  56. let keys;
  57. if (aType !== bType) {
  58. return false;
  59. }
  60. switch (typeof a) {
  61. case 'object':
  62. if (aArray || bArray) {
  63. if (aArray && bArray) {
  64. return a.length === b.length && a.every((aValue, index) => {
  65. const bValue = b[index];
  66. return _.isEqual(aValue, bValue);
  67. });
  68. }
  69. return false;
  70. }
  71. if (a === null || b === null) {
  72. return a === b;
  73. }
  74. // Compare object keys and values
  75. keys = Object.keys(a);
  76. if (Object.keys(b).length !== keys.length) {
  77. return false;
  78. }
  79. for (const key of keys) {
  80. if (!b.hasOwnProperty(key)) {
  81. return false;
  82. }
  83. }
  84. return _.every(a, (aValue, key) => {
  85. const bValue = b[key];
  86. return _.isEqual(aValue, bValue);
  87. });
  88. default:
  89. return a === b;
  90. }
  91. },
  92. escapeHtml(html) {
  93. const regexResult = escapeHtmlRegex.exec(html);
  94. if (!regexResult) return html;
  95. let result = '';
  96. let escape = '';
  97. let lastIndex = 0;
  98. let i = regexResult.index;
  99. for (; i < html.length; i++) {
  100. switch (html.charAt(i)) {
  101. case '"':
  102. escape = '&quot;';
  103. break;
  104. case '&':
  105. escape = '&amp;';
  106. break;
  107. case '\'':
  108. escape = '&apos;';
  109. break;
  110. case '<':
  111. escape = '&lt;';
  112. break;
  113. case '>':
  114. escape = '&gt;';
  115. break;
  116. default:
  117. continue;
  118. }
  119. if (lastIndex !== i) result += html.substring(lastIndex, i);
  120. lastIndex = i + 1;
  121. result += escape;
  122. }
  123. if (lastIndex !== i) return result + html.substring(lastIndex, i);
  124. return result;
  125. },
  126. strcmp(a, b) {
  127. if (a < b) return -1;
  128. if (a > b) return 1;
  129. return 0;
  130. },
  131. isUndefined(val) {
  132. return toString.call(val) === '[object Undefined]';
  133. },
  134. isObject(val) {
  135. return toString.call(val) === '[object Object]';
  136. },
  137. deepMerge() {
  138. const target = arguments[0] || {};
  139. const {
  140. length
  141. } = arguments;
  142. // eslint-disable-next-line one-var
  143. let src, clone, copyIsArray;
  144. function assignValue(val, key) {
  145. src = target[key];
  146. copyIsArray = Array.isArray(val);
  147. if (_.isObject(val) || copyIsArray) {
  148. if (copyIsArray) {
  149. copyIsArray = false;
  150. clone = src && Array.isArray(src) ? src : [];
  151. } else {
  152. clone = src && _.isObject(src) ? src : {};
  153. }
  154. target[key] = _.deepMerge(clone, val);
  155. } else if (!_.isUndefined(val)) {
  156. target[key] = val;
  157. }
  158. }
  159. for (let i = 0; i < length; i++) {
  160. _.each(arguments[i], assignValue);
  161. }
  162. return target;
  163. }
  164. };
  165. module.exports = _;
  166. //# sourceMappingURL=under-dash.js.map