当前位置:   article > 正文

前端常用的一些函数公共方法_前端项目公共数据和函数有哪些

前端项目公共数据和函数有哪些

1、修改数组中对象的属性

  1. /**
  2. * 修改数组中对象的属性
  3. * @param attr 对象-键值对:{ 需要的属性:被修改的属性 }
  4. * @param array 数组
  5. * @returns 修改对象名称属性后的数组
  6. * 注意格式!!!
  7. * 举例:const data = changeAttr({ key: 'venueId', name: 'venueName' }, res.data)
  8. * 将res.data内属性venueId改为key, 将venueName属性改为name
  9. */
  10. export const changeAttr = (attr, array) => {
  11. const attrKeys = Object.keys(attr); // 需要的属性
  12. const attrValue = Object.values(attr); // 将被修改的属性
  13. const obj = {};
  14. const data = [];
  15. array &&
  16. array.length &&
  17. array.forEach((element) => {
  18. attrKeys.forEach((item, index) => {
  19. const key = attrValue?.[index];
  20. obj[item] = element?.[key];
  21. });
  22. data.push({ ...obj });
  23. });
  24. return data;
  25. };

2、下载文件

  1. /**
  2. * 下载文件
  3. * @param file 文件流
  4. * @param fileName 文件名称
  5. * @param type 文件类型(默认excel,下载MP3时需设置为'audio/mpeg')
  6. */
  7. export function download(file: File, fileName, type = 'application/vnd.ms-excel') {
  8. // 将文件流转成blob形式
  9. const blob = new Blob([file], { type });
  10. // 创建一个超链接,将文件流赋进去,然后实现这个超链接的单击事件
  11. const eLink = document.createElement('a');
  12. eLink.download = fileName;
  13. eLink.style.display = 'none';
  14. eLink.href = URL.createObjectURL(blob);
  15. document.body.appendChild(eLink);
  16. eLink.click();
  17. URL.revokeObjectURL(eLink.href); // 释放URL 对象
  18. document.body.removeChild(eLink);
  19. }

3、自定义唯一id

  1. // 自定义唯一id
  2. export const getUuid = () => {
  3. const s = [];
  4. const hexDigits = '0123456789abcdef';
  5. for (let i = 0; i < 36; i++) {
  6. s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
  7. }
  8. s[14] = '4'; // bits 12-15 of the time_hi_and_version field to 0010
  9. // eslint-disable-next-line no-bitwise
  10. s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1);
  11. // eslint-disable-next-line no-multi-assign
  12. s[8] = s[13] = s[18] = s[23] = '-';
  13. const uuid = s.join('');
  14. return uuid;
  15. };

4、图片压缩

  1. // 压缩方法
  2. // 图片大于2M进行压缩
  3. export const compressImg = (file) => {
  4. const fileSize = parseFloat(parseInt(file.size, 10) / 1024 / 1024).toFixed(2);
  5. const read = new FileReader();
  6. read.readAsDataURL(file);
  7. return new Promise((resolve, reject) => {
  8. read.onload = (e) => {
  9. const img = new Image();
  10. img.src = e.target.result;
  11. img.onload = () => {
  12. // 默认按比例压缩
  13. const w = this.width;
  14. const h = this.height;
  15. // 生成canvas
  16. const canvas = document.createElement('canvas');
  17. const ctx = canvas.getContext('2d');
  18. let base64;
  19. // 创建属性节点
  20. canvas.setAttribute('width', w);
  21. canvas.setAttribute('height', h);
  22. ctx.drawImage(this, 0, 0, w, h);
  23. if (fileSize < 1) {
  24. // 如果图片小于一兆 那么压缩0.5
  25. base64 = canvas.toDataURL(file.type, 0.5);
  26. } else if (fileSize > 1 && fileSize < 2) {
  27. // 如果图片大于1M并且小于2M 那么压缩0.5
  28. base64 = canvas.toDataURL(file.type, 0.5);
  29. } else {
  30. // 如果图片超过2m 那么压缩0.2
  31. base64 = canvas.toDataURL(file.type, 0.2);
  32. }
  33. // 回调函数返回file的值(将base64编码转成file)
  34. // files = that.dataURLtoFile(base64, file.name); // 如果后台接收类型为base64的话这一步可以省略
  35. resolve(base64);
  36. };
  37. };
  38. });
  39. };

5、递归树

6、二维数组过滤,返回满足条件的项[{ ...item }, { ...item }, ...]   可用于提取公共项,公共参数

eg:

[

    [{ ...item }, { ...item }],

    [{ ...item }, { ...item }],

    [{ ...item }, { ...item }, { ...item }],

    [{ ...item }, { ...item }, { ...item }, { ...item }]

]

  1. getCommonItems(...arrays) {
  2. if (arrays.length === 0 || arrays.length === 1) return [];
  3. // 二维数组分为第一个和其他项,使用以第一项为参考,后续得到的项也是第一项的结果
  4. // 所以第一项数据很重要,如有特殊需求,请进行一些处理
  5. const [baseArray, ...remainingArrays] = this.changeBaseArray(arrays);
  6. return baseArray.filter(item =>
  7. remainingArrays.every(array => array.some(el => this.isEqual(el, item))));
  8. }
  9. // 对比计算item项 某些参数 是否是一致的
  10. isEqual(obj1, obj2) {
  11. if (obj1.name === obj2.name && obj1.displayname === obj2.displayname && obj1.defaultvalue === obj2.defaultvalue) {
  12. if (obj1.listitems && obj2.listitems) { // 数组
  13. if (this.isListitemsEqual(obj1.listitems, obj2.listitems)) {
  14. return true;
  15. } else {
  16. return false;
  17. }
  18. } else if (obj1.range && obj2.range) { // 最大最小值
  19. if (obj1.range.startval === obj2.range.startval && obj1.range.stopval === obj2.range.stopval) return true;
  20. return false;
  21. } else {
  22. return true;
  23. }
  24. }
  25. return false;
  26. }

7、修改 二维数组 第一项数组,使其第一项某些字段必须为最大值,也可自定义第一项规则

  1. // 改变第一项结构
  2. changeBaseArray = (arrays) => {
  3. const newBaseArray = arrays[0];
  4. arrays.forEach((item) => {
  5. item.forEach((ele) => {
  6. const existItem = newBaseArray.find(i => i.name === ele.name);
  7. const existItemIndex = newBaseArray.findIndex(i => i.name === ele.name);
  8. if (ele.listitems && existItem && existItem.listitems.length < ele.listitems.length) {
  9. newBaseArray[existItemIndex].listitems = ele.listitems;
  10. }
  11. if (ele.range && existItem &&
  12. Number(ele.range.startval) <= Number(existItem.range.startval) &&
  13. Number(ele.range.stopval) >= Number(existItem.range.stopval)) {
  14. newBaseArray[existItemIndex].range = ele.range;
  15. }
  16. })
  17. })
  18. arrays[0] = newBaseArray;
  19. return arrays;
  20. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/701028
推荐阅读
相关标签
  

闽ICP备14008679号