parse.ts 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. import { forEach, forInObject, isArray, isObject, isString } from "./comm";
  2. /**
  3. * 解析数据
  4. * @example parse<Response>(res.data)
  5. */
  6. export function parse<T>(data: any): T | null {
  7. // #ifdef APP-ANDROID
  8. // @ts-ignore
  9. return (data as UTSJSONObject).parse<T>();
  10. // #endif
  11. // #ifndef APP-ANDROID
  12. return data as T;
  13. // #endif
  14. }
  15. /**
  16. * 解析JSON对象
  17. * @param data 要解析的数据
  18. * @returns 解析后的JSON对象
  19. */
  20. export function parseObject<T>(data: string): T | null {
  21. // #ifdef APP-ANDROID
  22. return JSON.parseObject<T>(data);
  23. // #endif
  24. // #ifndef APP-ANDROID
  25. return JSON.parse(data) as T;
  26. // #endif
  27. }
  28. /**
  29. * 解析透传样式对象
  30. * @param data 要解析的数据
  31. * @returns 解析后的透传样式对象
  32. * @template T 透传样式对象的类型
  33. */
  34. export function parsePt<T>(data: any): T {
  35. // #ifdef APP-ANDROID
  36. // @ts-ignore
  37. return (data as UTSJSONObject).parse<T>() ?? ({} as T);
  38. // #endif
  39. // #ifndef APP-ANDROID
  40. return data as T;
  41. // #endif
  42. }
  43. /**
  44. * 解析对象为类名字符串
  45. * @param obj 要解析的对象,key为类名,value为布尔值表示是否启用该类名
  46. * @returns 解析后的类名字符串,多个类名以空格分隔
  47. * @example
  48. * parseClass({ 'active': true, 'disabled': false }) // 返回 'active'
  49. * parseClass(['ml-2', 'mr-2']) // 返回 'ml-2 mr-2'
  50. * parseClass([{ 'mr-2': true, 'mt-2': false }]) // 返回 'mr-2'
  51. * parseClass([[true, 'mr-2 pt-2', 'mb-2']]) // 返回 'mr-2 pt-2'
  52. */
  53. export const parseClass = (data: any): string => {
  54. // 存储启用的类名
  55. const names: string[] = [];
  56. // 解析数据
  57. function deep(d: any) {
  58. // 如果obj是数组,则将数组中的每个元素添加到names中
  59. if (isArray(d)) {
  60. forEach(d as any[], (value: any) => {
  61. if (isString(value)) {
  62. // @example 2
  63. names.push(value as string);
  64. } else if (isArray(value)) {
  65. // @example 4
  66. const [a, b] = value as any[];
  67. if (a as boolean) {
  68. names.push(b as string);
  69. } else {
  70. if (value.length > 2) {
  71. names.push(value[2] as string);
  72. }
  73. }
  74. } else if (isObject(value)) {
  75. // @example 3
  76. deep(value);
  77. }
  78. });
  79. }
  80. // 遍历对象的每个属性
  81. if (isObject(d)) {
  82. // @example 1
  83. forInObject(d, (value, key) => {
  84. // 如果属性值为true,则将类名添加到数组中
  85. if (value == true && key != "") {
  86. names.push(key.trim());
  87. }
  88. });
  89. }
  90. }
  91. deep(data);
  92. // 将类名数组用空格连接成字符串返回
  93. return names.join(" ");
  94. };
  95. /**
  96. * 将自定义类型数据转换为UTSJSONObject对象
  97. * @param data 要转换的数据
  98. * @returns 转换后的UTSJSONObject对象
  99. */
  100. export function parseToObject<T>(data: T): UTSJSONObject {
  101. // #ifdef APP-ANDROID
  102. return JSON.parseObject(JSON.stringify(data ?? {})!)!;
  103. // #endif
  104. // #ifndef APP-ANDROID
  105. return JSON.parse(JSON.stringify(data || {})) as UTSJSONObject;
  106. // #endif
  107. }
  108. /**
  109. * 将rpx单位转换为px单位
  110. * @param rpx 要转换的rpx值
  111. * @returns 转换后的px值
  112. * @example
  113. */
  114. export const rpx2px = (rpx: number): number => {
  115. let px: number;
  116. // #ifdef MP
  117. px = rpx / (750 / uni.getWindowInfo().windowWidth);
  118. // #endif
  119. // #ifndef MP
  120. px = uni.rpx2px(rpx);
  121. // #endif
  122. return px;
  123. };
  124. /**
  125. * 将px单位转换为rpx单位
  126. * @param px 要转换的px值
  127. * @returns 转换后的rpx值
  128. * @example
  129. */
  130. export const px2rpx = (px: number): number => {
  131. return px / rpx2px(1);
  132. };
  133. /**
  134. * 将数值或字符串转换为rpx单位的字符串
  135. * @param val 要转换的值,可以是数字或字符串
  136. * @returns 转换后的rpx单位字符串
  137. * @example
  138. * parseRpx(10) // 返回 '10rpx'
  139. * parseRpx('10rpx') // 返回 '10rpx'
  140. * parseRpx('10px') // 返回 '10px'
  141. */
  142. export const parseRpx = (val: number | string): string => {
  143. if (typeof val == "number") {
  144. return val + "rpx";
  145. }
  146. return val;
  147. };
  148. /**
  149. * 示例: 获取数值部分
  150. * @example
  151. * getNum("10rpx") // 返回 10
  152. * getNum("10px") // 返回 10
  153. * getNum("10") // 返回 10
  154. * getNum("-5.5px") // 返回 -5.5
  155. * @param val - 输入值,例如 "10rpx"、"10px"、"10"
  156. * @returns number - 返回提取的数值
  157. */
  158. export const getNum = (val: string): number => {
  159. // 使用正则提取数字部分,支持小数和负数
  160. const match = val.match(/-?\d+(\.\d+)?/);
  161. return match != null ? parseFloat(match[0] ?? "0") : 0;
  162. };
  163. /**
  164. * 示例: 获取单位
  165. * @example
  166. * getUnit("10rpx") // 返回 "rpx"
  167. * getUnit("10px") // 返回 "px"
  168. * @param val - 输入值,例如 "10rpx"、"10px"
  169. * @returns string - 返回单位字符串,如 "rpx" 或 "px"
  170. */
  171. export const getUnit = (val: string): string => {
  172. const num = getNum(val);
  173. return val.replace(`${num}`, "");
  174. };
  175. /**
  176. * 示例: 转换为 rpx 值
  177. * @example
  178. * getRpx("10rpx") // 返回 10
  179. * getRpx("10px") // 返回 px2rpx(10)
  180. * getRpx(10) // 返回 10
  181. * @param val - 输入值,可以是 "10rpx"、"10px" 或数字 10
  182. * @returns number - 返回对应的 rpx 数值
  183. */
  184. export const getRpx = (val: number | string): number => {
  185. if (typeof val == "number") {
  186. return val;
  187. }
  188. const num = getNum(val);
  189. const unit = getUnit(val);
  190. if (unit == "px") {
  191. return px2rpx(num);
  192. }
  193. return num;
  194. };
  195. /**
  196. * 示例: 转换为 px 值
  197. * @example
  198. * getPx("10rpx") // 返回 rpx2px(10)
  199. * getPx("10px") // 返回 10
  200. * getPx(10) // 返回 rpx2px(10)
  201. * @param val - 输入值,可以是 "10rpx"、"10px" 或数字 10
  202. * @returns number - 返回对应的 px 数值
  203. */
  204. export const getPx = (val: string | number) => {
  205. if (typeof val == "number") {
  206. return rpx2px(val);
  207. }
  208. const num = getNum(val);
  209. const unit = getUnit(val);
  210. if (unit == "rpx") {
  211. return rpx2px(num);
  212. }
  213. return num;
  214. };