base.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. /**
  2. * 深度克隆
  3. * Object deepClone
  4. * @param {Object} obj the object need clone
  5. */
  6. function deepClone(obj) {
  7. if (typeof obj !== 'object' || obj === null) {
  8. return obj;
  9. }
  10. if (Array.isArray(obj)) {
  11. return obj.map((v) => {
  12. if (typeof v === 'object' && v !== null) {
  13. return deepClone(v);
  14. } else {
  15. return v;
  16. }
  17. });
  18. } else {
  19. const newObj = {};
  20. Object.keys(obj).forEach((v) => {
  21. if (typeof obj[v] === 'object' && obj[v] !== null) {
  22. newObj[v] = deepClone(obj[v]);
  23. } else {
  24. newObj[v] = obj[v];
  25. }
  26. });
  27. return newObj;
  28. }
  29. }
  30. /**
  31. * @param {Object} target -目标对象
  32. * @param {...Object} source -原对象
  33. * @return {Object}
  34. */
  35. function assign(target, ...source) {
  36. const newObj = target;
  37. if (source.length > 1) {
  38. let newTarget = source[0];
  39. source.splice(0, 1);
  40. source = assign(newTarget, ...source);
  41. } else {
  42. source = source[0];
  43. }
  44. Object.keys(newObj).forEach((v) => {
  45. if (typeof newObj[v] === 'object' && newObj[v] !== null && typeof source[v] === 'object' && source[v] !== null) {
  46. newObj[v] = assign(newObj[v], source[v]);
  47. delete source[v];
  48. }
  49. });
  50. Object.keys(source).forEach((v) => {
  51. newObj[v] = source[v];
  52. });
  53. return newObj;
  54. }
  55. /**
  56. * 返回空
  57. * @returns {Object} -null
  58. */
  59. function noop() {
  60. return null;
  61. }
  62. /**
  63. * 判断属性是否是对象的私有属性 非原型链属性
  64. * @param {Object} obj -对象
  65. * @param {string} type -属性
  66. * @returns {Boolean}
  67. */
  68. function hasOwn(obj, type) {
  69. return Object.prototype.hasOwnProperty.call(obj, type);
  70. }
  71. /**
  72. * 判断变量是否未定义
  73. * @param item
  74. * @returns {Boolean}
  75. */
  76. function isUndef(item) {
  77. return item === undefined || item === null;
  78. }
  79. /**
  80. * 判断变量是否定义
  81. * @param item
  82. * @returns {Boolean}
  83. */
  84. function isDef(item) {
  85. return !this.isUndefined(item);
  86. }
  87. /**
  88. * 判断是否是字符串
  89. * @param {any} item
  90. * @returns {Boolean}
  91. */
  92. function isStr(item) {
  93. return typeof item === 'string';
  94. }
  95. /**
  96. * 判断是否是数字
  97. * @param {any} item
  98. * @returns {Boolean}
  99. */
  100. function isNumber(item) {
  101. return typeof item === 'number';
  102. }
  103. /**
  104. * 判断是否是数组
  105. * @param {any} item
  106. * @returns {Boolean}
  107. */
  108. function isArray(item) {
  109. // 判断是否有 isArray方法 如果有绑定当前content 返回
  110. if (typeof Array.isArray === 'function') {
  111. return Array.isArray.bind(this)(item);
  112. }
  113. // pollfill
  114. return Object.prototype.toString.call(item) === '[object Array]';
  115. }
  116. /**
  117. * 判断是否是对象
  118. * @param {any} item
  119. * @returns {Boolean}
  120. */
  121. function isObj(obj) {
  122. return obj !== null && typeof obj === 'object';
  123. }
  124. /**
  125. * 判断是否是函数
  126. * @param {any} item
  127. * @returns {Boolean}
  128. */
  129. function isFunc(item) {
  130. return typeof item === 'function';
  131. }
  132. /**
  133. * 转数字
  134. * @param {any} val
  135. * @returns {(typeof val | number)} -返回的值
  136. */
  137. function toNumber(val) {
  138. let n = parseFloat(val);
  139. return isNaN(n) ? val : n;
  140. }
  141. function isEmpty(v) {
  142. if (typeof v == "undefined" || v == null) {
  143. return true
  144. }
  145. if (v == 0 || v == "") {
  146. return true
  147. }
  148. return /^\s+$/g.test(v)
  149. }
  150. function fenToYuan(cost) {
  151. if (cost == null || cost <= 0) {
  152. return 0.00
  153. }
  154. var res = parseInt((cost / 100) * 100) / 100
  155. return res.toFixed(2);
  156. }
  157. function diffArr(arr1, arr2) {
  158. return arr1.concat(arr2).filter(function (v) {
  159. return arr1.indexOf(v)===-1 || arr2 .indexOf(v)===-1
  160. })
  161. }
  162. /**
  163. * 计算距离,返回米
  164. */
  165. function getDistance(lat1, lng1, lat2, lng2) {
  166. var radLat1 = lat1 * Math.PI / 180.0;
  167. var radLat2 = lat2 * Math.PI / 180.0;
  168. var a = radLat1 - radLat2;
  169. var b = lng1 * Math.PI / 180.0 - lng2 * Math.PI / 180.0;
  170. var s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2)));
  171. s = s * 6378.137;
  172. s = Math.round(s * 10000) / 10;
  173. return s
  174. }
  175. function parseUrlParamToObj(str) {
  176. str = decodeURIComponent(str)
  177. // 创建目标对象
  178. let params = {},
  179. // 截取数据字符串
  180. data=str.slice(str.indexOf("?")),
  181. aParams = data.substr(1).split("&")
  182. for (let i = 0; i < aParams.length; i++) {
  183.    let aParam = aParams[i].split("=");
  184.    params[aParam[0]] = aParam[1]
  185. }
  186. return params;
  187. }
  188. /**
  189. * base module. - 公共基础方法模块
  190. * @module utils/base
  191. * @see module:utils/base
  192. */
  193. module.exports = {
  194. /** 深拷贝 */
  195. deepClone,
  196. noop,
  197. hasOwn,
  198. isUndef,
  199. isDef,
  200. isStr,
  201. isNumber,
  202. isArray,
  203. isObj,
  204. isFunc,
  205. toNumber,
  206. assign,
  207. isEmpty,
  208. fenToYuan,
  209. diffArr,
  210. getDistance,
  211. parseUrlParamToObj
  212. };