JS常用方法

1、判断对象数组是否有相同属性 相同:true \ 不相同:false

export const hasDuplicates = (array, keyArr) => {
  return array.some((item, index) => {
    return array.findIndex((v, i) => {
      let keyValue = '';
      let keyValue1 = '';
      keyArr.forEach(d => {
        keyValue = keyValue += JSON.stringify(v[d]);
        keyValue1 = keyValue1 += JSON.stringify(item[d]);
      });
      return i !== index && keyValue === keyValue1;
    }) !== -1;
  });
};

2、冒泡排序

// 冒泡排序
export const maopaoSort = (array) => {
  if (Array.isArray(array)) {
    if (array.length === 1) {
      return array;
    }
    let temp = null;
    for (let i = 0; i < array.length; i++) {
      for (let j = 0; j < array.length - i - 1; j++) {
        if (array[j] > array[j + 1]) {
          temp = array[j];
          array[j] = array[j + 1];
          array[j + 1] = temp;
        }
      }
    }
    return array;
  }
};

3、数组对象去重,根据key去重

// 数组对象去重,根据key去重
export const nodup = (arr, key) => {
  const map = new Map();
  for (const item of arr) {
    if (!map.has(key ? item[key] : item)) {
      map.set(key ? item[key] : item, item);
    }
  }
  return [...map.values()];
};

4、截取几位小数

/**
 * 截取几位小数
 * @param {number} value 浮点数
 * @param {number} [number=2] 保留几位小数
 * @param {boolean} [round] 是否四舍五入
 * @returns {number}
 */
export function toFixed(value, number = 2, round) {
  const method = round ? Math.round : Math.floor;
  return method(Math.pow(10, number) * value) / Math.pow(10, number);
}

5、递归对象或数组清除文本类型值的两边空格

/**
 * 递归对象或数组清除文本类型值的两边空格
 * @param {Object|Array} obj
 * @return {Object|Array}
 */
export function trim(obj) {
  const type = typeof obj;
  if (type === 'string') {
    return obj.trim();
  }
  if (Array.isArray(obj)) {
    return obj.map(n => trim(n));
  }
  if (obj && type === 'object') {
    Object.entries(obj).forEach(([k, v]) => {
      obj[k] = trim(v);
    });
    return obj;
  }
  return obj;
}

6、获取数据类型

/**
 * 获取数据类型
 * @param {*} data 任何数据
 * @return {string} 数据类型,如:Number,String,Boolean,Object,Array,Date,Null,Undefined
 */
export function getType(data) {
  const str = Object.prototype.toString.call(data);
  const result = str.match(/\[object ([\w]+)\]/);
  return (result && result.length > 1)
    ? result[1]
    : '';
}

7、数字转发大写金额格式

// 数字转发大写金额格式
export function toChineseMoney(n) {
  if (n === 0) {
    return '零';
  }
  if (!/^(\+|-)?(0|[1-9]\d*)(\.\d+)?$/.test(n)) {
    return '数据非法';
  }
  let unit = '仟佰拾亿仟佰拾万仟佰拾元角分';
  let str = '';
  n += '00';
  const a = parseFloat(n);
  if (a < 0) {
    n = n.substr(1);
  }
  const p = n.indexOf('.');
  if (p >= 0) {
    n = n.substring(0, p) + n.substr(p + 1, 2);
  }

  unit = unit.substr(unit.length - n.length);

  for (let i = 0; i < n.length; i++) {
    str += '零壹贰叁肆伍陆柒捌玖'.charAt(n.charAt(i)) + unit.charAt(i);
  }
  if (a > 0) {
    return str.replace(/零([仟佰拾角])/g, '零').replace(/(零)+/g, '零').replace(/零([万亿元])/g, '$1').replace(/(亿)万|壹(拾)/g, '$1$2').replace(/^元零?|零分/g, '').replace(/元$/g, '圆整');
  } else {
    return '负' + str.replace(/零([仟佰拾角])/g, '零').replace(/(零)+/g, '零').replace(/零([万亿元])/g, '$1').replace(/(亿)万|壹(拾)/g, '$1$2').replace(/^元零?|零分/g, '').replace(/元$/g, '圆整');
  }
}

8、数字格式

/**
 * 数字格式
 * value:值
 * decimalsLen: 保留几位小数
 * integerLen: 整数长度
 * */
export function numberFormat(value, decimalsLen, integerLen = 9) {
  value = String(value);
  if (decimalsLen) {
    value = value.replace(/[^0-9.]/ig, '');
  }
  if (!decimalsLen) {
    value = value.replace(/[^0-9]/ig, '');
    let arr = value.split('');
    if (arr[0] === '0') {
      return '0';
    }
    if (arr?.length > integerLen) {
      arr = arr.splice(0, integerLen);
    }
    return arr.join('');
  }
  let dotIndex = 0;
  for (let i = 0; i < value.length; i++) {
    if (value[i] === '.') {
      dotIndex = i;
      break;
    }
  }
  value = value.replace(/\./ig, '');
  value = value.split('');
  if (dotIndex !== 0) {
    value.splice(dotIndex, 0, '.');
  }
  value = value.join('');
  const arr = value.split('.');
  if (arr[0].indexOf('0') === 0) arr[0] = 0;
  if (arr[0].length > integerLen) {
    arr[0] = arr[0].substring(0, integerLen);
  }
  if (arr[1]?.length > decimalsLen) {
    arr[1] = arr[1].slice(0, decimalsLen);
  }
  if (arr.length === 2) value = arr[0] + '.' + arr[1];
  if (dotIndex === 0) value = arr[0];
  return value;
}

9、文件下载模块

/**
 * 文件下载模块
 * @module download
 */

/**
 * 二进制文件流下载
 * @param {BlobPart} data 文件流
 * @param {string} fileName 下载文件名
 */
export function downloadBlob(data, fileName) {
  const blob = new Blob([data]);
  const link = document.createElement('a');
  link.download = fileName;
  link.style.display = 'none';
  link.href = URL.createObjectURL(blob);
  link.click();
  URL.revokeObjectURL(link.href);
}

/**
 * 文件url下载
 * @param {string} url 文件地址
 * @param {string} fileName 下载文件名
 */
export function downloadUrl(url, fileName) {
  const link = document.createElement('a');
  link.download = fileName;
  link.href = url;
  link.target = '_blank';
  link.click();
}

/**
 * post方式下载文件
 * @param {string} url 请求地址
 * @param {object} params 请求参数对象
 * @param {string} [method=post] 请求类型
 */
export function downloadPost(url, params = {}, method = 'post') {
  const form = document.createElement('form');
  form.style.display = 'none';
  form.action = url;
  form.method = method;
  form.target = '_blank';
  Object.keys(params).forEach(name => {
    const input = document.createElement('input');
    input.type = 'hidden';
    input.name = name;
    input.value = params[name];
    form.appendChild(input);
  });
  document.body.appendChild(form);
  form.submit();
  document.body.removeChild(form);
}

export default {
  downloadBlob,
  downloadUrl,
  downloadPost
};

10、日期格式化

/**
 * 日期格式化
 */
export function dateFormat (fmt, date) {
  const o = {
    'M+': date.getMonth() + 1,
    'd+': date.getDate(),
    'H+': date.getHours(),
    'm+': date.getMinutes(),
    's+': date.getSeconds(),
    'q+': Math.floor((date.getMonth() + 3) / 3),
    S: date.getMilliseconds()
  };
  if (/(y+)/.test(fmt)) {
    fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length));
  }
  for (const k in o) {
    if (new RegExp('(' + k + ')').test(fmt)) {
      fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length)));
    }
  }
  return fmt;
}

11、给localStorage||sessionStorage设置时间失效

//给localStorage||sessionStorage设置时间失效
//storage可以是localStorage||sessionStorage
//key 存储的key(必传)  value 存储的内容(必传)   time 多少分钟后失效(非必传)
//思路:设置本地存储的时候存下当前设置的时间+失效时间,获取的时候判断当前获取的时间是不是大于存下的时间如果是就是失效
//	   否则就是有效。如果调用setItem的时候没有传time则一直有效
class Store{
	constructor(storage) {
		this.storage = storage
	}
	setItem(key, value, time) {
		time = time ? Date.parse(new Date()) + time * 1000 * 60 : null
		let params = {
			value: value,
			time: time ? time : null
		}
		window[this.storage].setItem(key, JSON.stringify(params))
	}
	getItem(key) {
		let params = window[this.storage].getItem(key)
		if (!params) return null
		params = JSON.parse(params)
		if (params.time) {
			if (params.time > Date.parse(new Date)) {
				return params.value
			}
			this.removeItem(key)
			return null
		}
		return params.value
	}
	removeItem(key) {
		window[this.storage].removeItem(key)
	}
	clear() {
		window[this.storage].clear()
	}

}

  • 9
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值