index.js 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  1. /**
  2. * 字符串类
  3. */
  4. export class StringManager {
  5. constructor() {}
  6. /**
  7. * 获取uuid
  8. * @param {Number} len uuid的长度
  9. * @param {Boolean} first 默认的首字母
  10. * @param {Nubmer} radix 生成uuid的基数(意味着返回的字符串都是这个基数),2-二进制,8-八进制,10-十进制,16-十六进制
  11. */
  12. uuid = (len = 32, first = "", radix = null) => {
  13. const chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('')
  14. const uuid = []
  15. radix = radix || chars.length
  16. if (len) {
  17. // 如果指定uuid长度,只是取随机的字符,0|x为位运算,能去掉x的小数位,返回整数位
  18. for (let i = 0; i < len; i++) uuid[i] = chars[0 | Math.random() * radix]
  19. } else {
  20. let r
  21. // rfc4122标准要求返回的uuid中,某些位为固定的字符
  22. uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-'
  23. uuid[14] = '4'
  24. for (let i = 0; i < 36; i++) {
  25. if (!uuid[i]) {
  26. r = 0 | Math.random() * 16
  27. uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r]
  28. }
  29. }
  30. }
  31. // 移除第一个字符,并用u替代,因为第一个字符为数值时,该guuid不能用作id或者class
  32. if (first != "") {
  33. uuid.shift()
  34. return `${first}${uuid.join('')}`
  35. }
  36. return uuid.join('')
  37. }
  38. /**
  39. * @description 去除空格
  40. * @param String str 需要去除空格的字符串
  41. * @param String pos both(左右)|left|right|all 默认both
  42. */
  43. trim = (str, pos = 'both') => {
  44. str = String(str)
  45. if (pos == 'both') {
  46. return str.replace(/^\s+|\s+$/g, '')
  47. }
  48. if (pos == 'left') {
  49. return str.replace(/^\s*/, '')
  50. }
  51. if (pos == 'right') {
  52. return str.replace(/(\s*$)/g, '')
  53. }
  54. if (pos == 'all') {
  55. return str.replace(/\s+/g, '')
  56. }
  57. return str
  58. }
  59. /**
  60. * 验证字符串
  61. */
  62. isString = (str) => {
  63. return typeof str === 'string'
  64. }
  65. /**
  66. * 验证是否包含某个值
  67. */
  68. isContains = (str1, str2) => {
  69. return str1.indexOf(str2) >= 0
  70. }
  71. /**
  72. * 是否json字符串
  73. */
  74. isJsonString = (str) => {
  75. if (typeof str === 'string') {
  76. try {
  77. const obj = JSON.parse(str)
  78. if (typeof obj === 'object' && obj) {
  79. return true
  80. }
  81. return false
  82. } catch (e) {
  83. return false
  84. }
  85. }
  86. return false
  87. }
  88. /**
  89. * 字节格式化
  90. */
  91. sizeFormat = (size) => {
  92. if (size < 1024) {
  93. return size + 'B';
  94. } else if (size < (1024 * 1024)) {
  95. var temp = size / 1024;
  96. temp = temp.toFixed(2);
  97. return temp + 'KB';
  98. } else if (size < (1024 * 1024 * 1024)) {
  99. var temp = size / (1024 * 1024);
  100. temp = temp.toFixed(2);
  101. return temp + 'MB';
  102. } else {
  103. var temp = size / (1024 * 1024 * 1024);
  104. temp = temp.toFixed(2);
  105. return temp + 'GB';
  106. }
  107. }
  108. /**参数说明:
  109. * 根据长度截取先使用字符串,超长部分追加…
  110. * str 对象字符串
  111. * len 目标字节长度
  112. * 返回值: 处理结果字符串
  113. */
  114. substring = (str, len = 10, end = "...") => {
  115. if (str) {
  116. if (str.length <= len) {
  117. return str;
  118. }
  119. let strlen = 0;
  120. let s = "";
  121. for (let i = 0; i < str.length; i++) {
  122. s = s + str.charAt(i);
  123. strlen = strlen + 1;
  124. if (strlen > len) {
  125. return s.substring(0, s.length - 1) + end;
  126. }
  127. }
  128. return s;
  129. } else {
  130. return '';
  131. }
  132. }
  133. /**
  134. * 隐藏字符
  135. * @param str 原始字符串
  136. * @param starCount 显示隐藏字符的个数
  137. * @param prevCount 开始显示的字符串个数
  138. * @param endCount 结束显示的字符串个数
  139. */
  140. hideString = (str, starCount = 4, prevCount = 3, endCount = 4) => {
  141. if (!str) {
  142. return "";
  143. }
  144. if (str <= prevCount || str.length <= (prevCount + endCount)) {
  145. return str;
  146. }
  147. let starStr = "******************************";
  148. let startStr = str.substr(0, prevCount);
  149. let endStr = str.substr(str.length - endCount, endCount);
  150. return startStr + starStr.substr(0, starCount) + endStr;
  151. }
  152. /**
  153. * 字符串反转
  154. */
  155. reverse(str) {
  156. return str.split('').reverse().join('');
  157. }
  158. /**
  159. * 随机字符串
  160. * @param length 生成的长度
  161. * @param num 是否包含数字
  162. * @param lowerLetters 是否包含小写字母
  163. * @param upperLetters 是否包含大写字母
  164. * @param specialCharacters 是否包含特殊字符
  165. */
  166. random = (length, num = true, lowerLetters = true, upperLetters = true, specialCharacters = true) => {
  167. // 数字
  168. let numbers = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];
  169. // 小写字母
  170. let lowers = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'];
  171. // 大写字母
  172. let uppers = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];
  173. // 特殊字符
  174. let specials = ['#', '!', '@', '$', '%', '^', '&'];
  175. // 可用的字符集合
  176. let values = [];
  177. if (num) {
  178. values = values.concat(numbers);
  179. }
  180. if (lowerLetters) {
  181. values = values.concat(lowers);
  182. }
  183. if (upperLetters) {
  184. values = values.concat(uppers);
  185. }
  186. if (specialCharacters) {
  187. values = values.concat(specials);
  188. }
  189. // 返回值
  190. let returnArr = [];
  191. if (length > 0) {
  192. for (let i = 0; i < length; i++) {
  193. // 去除一个随机值
  194. let index = Math.floor(Math.random() * values.length);
  195. returnArr.push(values[index]);
  196. }
  197. }
  198. return returnArr.join("");
  199. }
  200. /**
  201. * 转大写
  202. */
  203. toUpper = (str) => {
  204. if (this.isString(str)) {
  205. return str.toUpperCase()
  206. }
  207. return str;
  208. }
  209. /**
  210. * 转小写
  211. */
  212. toLower = (str) => {
  213. if (this.isString(str)) {
  214. return str.toLowerCase()
  215. }
  216. return str;
  217. }
  218. /**
  219. * 下划线转驼峰
  220. */
  221. underlineToHump = (str) => {
  222. return str.replace(/\_(\w)/g, function(all, letter) {
  223. return letter.toUpperCase();
  224. });
  225. }
  226. /**
  227. * 驼峰转下划线
  228. */
  229. humpToUnderline = (str) => {
  230. return str.replace(/([A-Z])/g, "_$1").toLowerCase();
  231. }
  232. /**
  233. *@param {string} url 完整的URL地址
  234. *@returns {object} 自定义的对象
  235. *@description 用法示例:var myURL = parseURL('http://abc.com:8080/dir/index.html?id=255&m=hello#top');
  236. myURL.file='index.html'
  237. myURL.hash= 'top'
  238. myURL.host= 'abc.com'
  239. myURL.query= '?id=255&m=hello'
  240. myURL.params= Object = { id: 255, m: hello }
  241. myURL.path= '/dir/index.html'
  242. myURL.segments= Array = ['dir', 'index.html']
  243. myURL.port= '8080'
  244. myURL.protocol= 'http'
  245. myURL.source= 'http://abc.com:8080/dir/index.html?id=255&m=hello#top'
  246. */
  247. parseUrl = (url) => {
  248. var a = document.createElement('a');
  249. a.href = url;
  250. return {
  251. source: url,
  252. protocol: a.protocol.replace(':', ''),
  253. host: a.hostname,
  254. port: a.port,
  255. query: a.search,
  256. params: (function() {
  257. var ret = {},
  258. seg = a.search.replace(/^\?/, '').split('&'),
  259. len = seg.length,
  260. i = 0,
  261. s;
  262. for (; i < len; i++) {
  263. if (!seg[i]) {
  264. continue;
  265. }
  266. s = seg[i].split('=');
  267. ret[s[0]] = s[1];
  268. }
  269. return ret;
  270. })(),
  271. file: (a.pathname.match(/\/([^\/?#]+)$/i) || [, ''])[1],
  272. hash: a.hash.replace('#', ''),
  273. path: a.pathname.replace(/^([^\/])/, '/$1'),
  274. relative: (a.href.match(/tps?:\/\/[^\/]+(.+)/) || [, ''])[1],
  275. segments: a.pathname.replace(/^\//, '').split('/')
  276. };
  277. }
  278. /**
  279. * 将字符串转换为16进制
  280. */
  281. stringToHex = (str, isUrlEncode = true) => {
  282. let val = "";
  283. if (isUrlEncode) {
  284. // 如果包含特殊字符或中文先转换
  285. str = encodeURIComponent(str);
  286. }
  287. for (let i = 0; i < str.length; i++) {
  288. val += str.charCodeAt(i).toString(16);
  289. }
  290. return val;
  291. }
  292. /**
  293. * 十六进制转换为字符串
  294. * @param {*} str
  295. */
  296. hexToString = (str, isUrlDecode = true) => {
  297. var val = "",
  298. len = str.length / 2;
  299. for (var i = 0; i < len; i++) {
  300. val += String.fromCharCode(parseInt(str.substr(i * 2, 2), 16));
  301. }
  302. if (!isUrlDecode) {
  303. return val;
  304. }
  305. // 转换结果
  306. return decodeURIComponent(val);
  307. }
  308. }