Util.ts 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. const { ccclass, property } = cc._decorator;
  2. @ccclass
  3. export default class Util {
  4. /**
  5. * 打乱数组
  6. * @param arr 要打乱的数组
  7. * @returns 打乱后的数组
  8. */
  9. static Shuffle<T>(arr: Array<T>): Array<T> {
  10. var len = arr.length;
  11. for (var i = len - 1; i >= 0; i--) {
  12. var j = Math.floor(Math.random() * len);
  13. var temp = arr[i];
  14. arr[i] = arr[j];
  15. arr[j] = temp;
  16. }
  17. return arr;
  18. }
  19. /**
  20. * 获取固定长度字符串 用于太长名字截断
  21. * @param str 原字符串
  22. * @param len 取字符长度
  23. * @returns 返回的字符串
  24. */
  25. public static cutStr(str: string, len: number): string {
  26. var str_length = 0;
  27. var str_len = 0;
  28. let str_cut = "";
  29. str_len = str.length;
  30. for (var i = 0; i < str_len; i++) {
  31. let a = str.charAt(i);
  32. str_length++;
  33. if (escape(a).length > 4) {
  34. //中文字符的长度经编码之后大于4
  35. str_length++;
  36. }
  37. str_cut = str_cut.concat(a);
  38. if (str_length >= len) {
  39. str_cut = str_cut.concat("...");
  40. return str_cut;
  41. }
  42. }
  43. //如果给定字符串小于指定长度,则返回源字符串;
  44. if (str_length < len) {
  45. return str;
  46. }
  47. }
  48. /**
  49. * 取一个区间内随机整数
  50. * @param n 开始位置
  51. * @param m 结束位置
  52. * @returns 返回的随机整数
  53. */
  54. public static rnd(n, m): number {
  55. var random = Math.floor(Math.random() * (m - n + 1) + n);
  56. return random;
  57. }
  58. static _hasOwnProperty = Object.prototype.hasOwnProperty;
  59. /**
  60. * 一个对象是否有prop属性
  61. * @param obj 对象
  62. * @param prop 属性
  63. * @returns 返回是否有
  64. */
  65. static has(obj: any, prop: any) {
  66. return Util._hasOwnProperty.call(obj, prop);
  67. }
  68. /**
  69. * 对比两个对象的大小
  70. * @param a 对象a
  71. * @param b 对象b
  72. * @returns 返回值 a < b : -1, a == b : 0, a > b : 1
  73. */
  74. static defaultCompare<T>(a: T, b: T): number {
  75. if (a < b) {
  76. return -1;
  77. } else if (a === b) {
  78. return 0;
  79. } else {
  80. return 1;
  81. }
  82. }
  83. /**根据key给对象排序
  84. * @param obj
  85. * @param key
  86. */
  87. static objSortByKey(obj: any, key: string) {
  88. if (!obj.length) {
  89. mk.console.log("该对象不是数组或者元素个数为零");
  90. return;
  91. }
  92. let compare = (a, b) => {
  93. let a_value = a[key];
  94. let b_value = b[key];
  95. if (a_value < b_value) {
  96. return -1;
  97. } else if (a_value === b_value) {
  98. return 0;
  99. } else {
  100. return 1;
  101. }
  102. }
  103. obj.sort(compare);
  104. }
  105. /**
  106. * 将一个对象转为字符串
  107. * @param item 传入对象
  108. * @returns 返回值 字符串
  109. */
  110. static defaultToString(item: any): string {
  111. if (item === null) {
  112. return 'COLLECTION_NULL';
  113. } else if (Util.isUndefined(item)) {
  114. return 'COLLECTION_UNDEFINED';
  115. } else if (Util.isString(item)) {
  116. return '$s ' + item;
  117. } else {
  118. return '$o ' + item.toString();
  119. }
  120. }
  121. /**
  122. * 将所有属性用字符串格式拼接起来
  123. * @param item 要拼接属性的对象
  124. * @param join 拼接字符
  125. * @returns 返回值
  126. */
  127. static makeString<T>(item: T, join: string = ','): string {
  128. if (item === null) {
  129. return 'COLLECTION_NULL';
  130. } else if (Util.isUndefined(item)) {
  131. return 'COLLECTION_UNDEFINED';
  132. } else if (Util.isString(item)) {
  133. return item.toString();
  134. } else {
  135. let toret = '{';
  136. let first = true;
  137. for (const prop in item) {
  138. if (Util.has(item, prop)) {
  139. if (first) {
  140. first = false;
  141. } else {
  142. toret = toret + join;
  143. }
  144. toret = toret + prop + ':' + (<any>item)[prop];
  145. }
  146. }
  147. return toret + '}';
  148. }
  149. }
  150. /**
  151. * 检查func是否是一个函数
  152. * @param func 传入的参数
  153. * @returns 返回值 bool
  154. */
  155. static isFunction(func: any): boolean {
  156. return (typeof func) === 'function';
  157. }
  158. /**
  159. * 检查obj是否是undefined
  160. * @param obj 传入参数
  161. * @returns 返回值 bool
  162. */
  163. static isUndefined(obj: any): boolean {
  164. return (typeof obj) === 'undefined';
  165. }
  166. /**
  167. * 检查一个对象是否是字符串
  168. * @param obj 要检查的对象
  169. * @param 返回值 true : 是, false : 不是
  170. */
  171. static isString(obj: any): boolean {
  172. return Object.prototype.toString.call(obj) === '[object String]';
  173. }
  174. /**
  175. * 倒计时转换为时间格式(h:m:s) ,可自定义
  176. * @param t 秒
  177. * @param f 格式
  178. */
  179. public static ParseTime2Format(t: number, f: string = "h:m:s"): string {
  180. var d: number = Math.floor(t / 24 / 3600);
  181. var h: number = Math.floor((t / 3600) % 24);
  182. var m: number = Math.floor((t % 3600) / 60);
  183. var s: number = (t % 3600) % 60;
  184. function parse_format(t: number): string {
  185. var s: string = t.toString();
  186. if (t < 10) {
  187. s = "0" + t;
  188. }
  189. return s;
  190. }
  191. if (f.indexOf("d") != -1) {
  192. f = f.replace(/d/g, parse_format(d));
  193. }
  194. else {
  195. h += d * 24;
  196. }
  197. if (f.indexOf("h") != -1) {
  198. f = f.replace(/h/g, parse_format(h));
  199. } else {
  200. m += h * 60;
  201. }
  202. if (f.indexOf("m") != -1) {
  203. f = f.replace(/m/g, parse_format(m));
  204. } else {
  205. if (f.indexOf("h") != -1) {
  206. s += m * 60;
  207. } else {
  208. s = t;
  209. }
  210. }
  211. if (f.indexOf("s") != -1) {
  212. f = f.replace(/s/g, parse_format(s));
  213. }
  214. return f;
  215. }
  216. /**计算两点之间的弧度值 */
  217. static countHuBetweenToPos(startPos: cc.Vec2, endPos: cc.Vec2) {
  218. var hu: number = Math.atan2(endPos.y - startPos.y, endPos.x - startPos.x);
  219. //拥挤城市 +90 这边是 -90 可能跟引擎的原始坐标系有关
  220. return hu;
  221. }
  222. /**转换成年月日 2020-10-10 */
  223. static parseTimestamp(date: Date): string {
  224. // let year = date.getFullYear();
  225. // let month = date.getMonth()+1;
  226. // let day = date.getDay();
  227. // return
  228. var date = new Date(date);
  229. var YY = date.getFullYear() + '-';
  230. var MM = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-';
  231. var DD = (date.getDate() < 10 ? '0' + (date.getDate()) : date.getDate());
  232. return YY + MM + DD;
  233. }
  234. /**将时间戳转换为 20xx.10.xx 11:20:00 */
  235. static timestampToTime(timestamp: number): string {
  236. var date = new Date(timestamp * 1000);//时间戳为10位需*1000,时间戳为13位的话不需乘1000
  237. var Y = date.getFullYear() + '.';
  238. var M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '.';
  239. var D = (date.getDate() < 10 ? '0' + date.getDate() : date.getDate()) + ' ';
  240. var h = (date.getHours() < 10 ? '0' + date.getHours() : date.getHours()) + ':';
  241. var m = (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()) + ':';
  242. var s = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds();
  243. return Y + M + D + h + m + s;
  244. }
  245. /**数值保留小数
  246. * @param num 具体得数值
  247. * @param fixedNum 所保留的位数
  248. */
  249. static numberFixed(num: number, fixedNum: number): number {
  250. return Number(num.toFixed(fixedNum));
  251. //土方法实现保留小数位数
  252. // let num = Math.round((PlayerConst.cashNum * 100)) / 100;
  253. }
  254. /** 版本对比 */
  255. static versionCompareHandle(versionA, versionB) {
  256. console.log("JS Custom Version Compare: version A is " + versionA + ', version B is ' + versionB);
  257. var vA = versionA.split('.');
  258. var vB = versionB.split('.');
  259. for (var i = 0; i < vA.length; ++i) {
  260. var a = parseInt(vA[i]);
  261. var b = parseInt(vB[i] || 0);
  262. if (a === b) {
  263. continue;
  264. }
  265. else {
  266. return a - b;
  267. }
  268. }
  269. if (vB.length > vA.length) {
  270. return -1;
  271. }
  272. else {
  273. return 0;
  274. }
  275. }
  276. }