under-dash.js 3.6 KB

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