常用数据处理方法(例如对象清空,浮点数计算等)

187 阅读2分钟

一、对象清空 resetData

/**
 * @description 对象清空
 * @param {object} valueObj  传入的要清空的对象
 * @return Object
 */
export const resetData = (valueObj: any) => {
	if (Object.prototype.toString.call(valueObj) === '[object Object]') {
		const keys = Object.keys(valueObj)
		const obj: { [name: string]: string | Array<any> | boolean | number } = {}
		keys.forEach(item => {
			obj[item] =
				Object.prototype.toString.call(valueObj[item]) === '[object Array]'
					? []
					: typeof valueObj[item] === 'number'
					? 0
					: typeof valueObj[item] === 'boolean'
					? false
					: ''
		})
		Object.assign(valueObj, obj)
	} else {
		const keys = Object.keys(valueObj[0])
		const obj: { [name: string]: string | Array<any> | boolean | number } = {}
		keys.forEach(item => {
			obj[item] =
				Object.prototype.toString.call(valueObj[item]) === '[object Array]'
					? []
					: typeof valueObj[item] === 'number'
					? 0
					: typeof valueObj[item] === 'boolean'
					? false
					: ''
		})
		Object.assign(valueObj[0], obj)
	}
}

二、js浮点数乘法处理

/**
 *  js浮点数乘法处理
 * @param {} arg1
 * @param {*} arg2
 */
export const accMul = (arg1: number, arg2?: number) => {
	return arg2 ? Number(Number(arg1 * 100).toFixed(arg2)) : Number(Number(arg1 * 100).toFixed(2))
}

三、js浮点数除法处理

/**
 * js 浮点数除法处理
 * @param {*} arg1
 * @param {*} arg2
 */
export const accDiv = (arg1: number, arg2?: number) => {
	return arg2 ? Number(Number(arg1 / 100).toFixed(arg2)) : Number(Number(arg1 / 100).toFixed(2))
}

四、数字转金额格式

/**
 * 数字转金额格式
 * @param num 要格式化的数字
 * @param decimals 保留位数
 */
export const numberToMoney = (num: number | BigNumber, decimals = 2, thousandsSep = ','): string => {
	if (isNaN(num as any)) {
		return ''
	}
	const prec = !isFinite(+decimals) ? 0 : Math.abs(decimals) // 保留的位数一定是有限位数的正整数
	const sep = typeof thousandsSep === 'undefined' ? ',' : thousandsSep
	const s = new BigNumber(num).toString().replace(/,/g, '') // 字符串,将,变成'';
	const p = new BigNumber(s) // 解析一个字符串,并返回一个浮点数
	const n = p.isNaN() ? 1 : p
	const formatNum = n
		.toFixed(prec)
		.toString()
		.replace(/(\d)(?=(\d{3})+\.)/g, function ($0, $1) {
			return $1 + sep
		})
	return num ? formatNum : ''
}

五、时间戳转日期格式

type dateFormats = 'y-M-d' | 'y-M-d H:m:s' | 'y年M月d日' | 'y年M月d日 H时i分'

/**
 * 时间戳转日期格式
 * @param timestape
 * @param time
 * @returns
 */
export const dateFormat = (timestape: number, formats: dateFormats = 'y-M-d H:m:s'): string => {
	if (!timestape) {
		return ''
	}
	// 补零
	const zero = (val: number): string | number => {
		return val < 10 ? `0${val}` : val
	}
	const myDate = new Date(timestape)
	const year = myDate.getFullYear()
	const month = zero(myDate.getMonth() + 1)
	const day = zero(myDate.getDate())
	const hour = zero(myDate.getHours())
	const minute = zero(myDate.getMinutes())
	const second = zero(myDate.getSeconds())
	// 替换 formats 中的内容
	const replaceDate = (match: string): string => {
		return (
			{
				y: year,
				M: month,
				d: day,
				H: hour,
				m: minute,
				s: second
			} as any
		)[match]
	}
	return formats.replace(/Y|M|d|H|m|s/gi, replaceDate)
}

六、数组去重

const uniqueArr = (arr) => [...new Set(arr)];

console.log(uniqueArr(["1","2","1","2","3","4"]));
// ['1', '2', '3', '4']

七、获取当前h5页面的url参数

一般是h5嵌套到其他如(app,小程序等),双方之前的交互时用到的,在main.ts中直接使用

/**
 * 获取 url 中的参数
 * @param { String } url 获取参数 url
 * @returns { Object } 返回 url 参数
 */
export const getQueryString = (url = '') => {
  const baseUrl = url || window.location.href;
  const _pa = baseUrl.substring(baseUrl.indexOf('?') + 1);
  const _arrS = _pa.split('&');
  const _rs: any = {};
  for (let i = 0; i < _arrS.length; i++) {
    const pos = _arrS[i].indexOf('=');
    if (pos === -1) {
      continue;
    }
    const key = _arrS[i].substring(0, pos);
    const value = decodeURIComponent(_arrS[i].substring(pos + 1));
    _rs[key] = value;
  }
  return _rs;
};

//例如 当前页面为https://www.google.com.hk/search?number=666&string=money
//import { getQueryString } from '这个方法存放的地方';

const {number,string}: any = getQueryString();
console.log(number,string);//666 money

七、从url获取参数并转为对象

和上面不同的时需传入一个url

const getParameters = URL => JSON.parse(`{"${decodeURI(URL.split("?")[1]).replace(/"/g, 
'\\"').replace(/&/g, '","').replace(/=/g, '":"')}"}`)

getParameters("https://www.google.com.hk/search?number=666&string=money");
// {number: '666', string: 'money'}

八、检查对象是否为空

检查对象是否为空,实际上并不那么简单,即使对象为空,每次检查对象是否等于 {} 也会返回 false

const isEmpty = obj => Reflect.ownKeys(obj).length === 0 && obj.constructor === Object;
isEmpty({}) // true 
isEmpty({a:"not empty"}) //false

九、文字复制到剪贴板

Clipboard API 它的所有操作都是异步的,返回 Promise 对象,不会造成页面卡顿。而且,它可以将任意内容(比如图片)放入剪贴板。

const copyText = async (text) => await navigator.clipboard.writeText(text)
copyText('单行代码 前端世界')