export { uuidV4 } from './uuid'; /** 从 url 中取出 query 键值对 */ export function getQuery(href = location.href): Record { const hrefWithoutHash = href.split('#')[0]; const query = hrefWithoutHash.includes('?') ? hrefWithoutHash.split('?')[1] : hrefWithoutHash; const res = {}; if (!query.includes('=')) { return res; } for (const pair of query.split('&')) { const [key, value] = pair.split('='); res[key] = value; } return res; } /** 将 query 键值对转换为 url search 串 * @example stringifyQuery({ a: 1, b: 2 }) => 'a=1&b=2' */ export function stringifyQuery( query: Record, /** 是否将 key 转为 snake_case */ snakeCaseKey = true, ) { return Object.entries(query) .filter(([_k, v]) => v !== undefined && v !== null) .map(([k, v]) => `${snakeCaseKey ? hump2Underline(k) : k}=${v}`) .join('&'); } /** 将小驼峰转下划线 */ export function hump2Underline(s: string) { if (/^[A-Z]/.test(s)) { return s; } return s.replace(/([A-Z])/g, '_$1').toLowerCase(); } /** 将下划线转小驼峰 */ export function underline2Hump(s: string) { if (/^[A-Z]/.test(s)) { return s; } return s.replace(/(_[a-z])/g, (_all, letter) => letter.toUpperCase().slice(1)); } /** 将对象的下划线 key 都转为小驼峰 */ export function underline2HumpObjectKey(obj: Record) { if (!(typeof obj === 'object')) { return obj; } return Object.fromEntries(Object.entries(obj).map(([k, v]) => [underline2Hump(k), v])); }