前端开发项目中常用的js数组、对象数据处理方法

<------------------此贴将记录实际开发中需要的一些常用方法,后期会不断更新---------------------->

目录

1.随机字符串

2.图片url转换为file

3.递归部门列表

4.返回时间(年月日)

5.中文与数字相关 

6.GIS相关计算

7.深拷贝 

8.防抖 


1.随机字符串

// 随机字符串
  randString: length => {
    var text = ['abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', '1234567890'];
    var rand = function (min, max) {
      return Math.floor(Math.max(min, Math.random() * (max + 1)));
    };
    var len = rand(length, length); // 长度
    var pw = '';
    for (let i = 0; i < len; i++) {
      var strpos = rand(0, 2);
      pw += text[strpos].charAt(rand(0, text[strpos].length - 1));
    }
    return pw;
  },

 2.图片url转换为file

// 图片url转换为file
  setInitImg: (url, callback) => {
    let img = url; //这里是淘宝上随便找的一张图片
    let _ = util;
    let imgRes;
    util.getBase64(img, dataURL => {
      imgRes = util.dataURLtoFile(dataURL);
      callback(imgRes);
    });
  },
  getBase64: (url, callback) => {
    //通过构造函数来创建的 img 实例,在赋予 src 值后就会立刻下载图片,相比 createElement() 创建 <img> 省去了 append(),也就避免了文档冗余和污染
    var Img = new Image(),
      dataURL = '';
    Img.src = url + '?v=' + Math.random(); // 处理缓存,fix缓存bug,有缓存,浏览器会报错;
    Img.setAttribute('crossOrigin', 'Anonymous'); // 解决控制台跨域报错的问题
    Img.onload = function () {
      //要先确保图片完整获取到,这是个异步事件
      var canvas = document.createElement('canvas'), //创建canvas元素
        width = Img.width, //确保canvas的尺寸和图片一样
        height = Img.height;
      canvas.width = width;
      canvas.height = height;
      canvas.getContext('2d').drawImage(Img, 0, 0, width, height); //将图片绘制到canvas中
      dataURL = canvas.toDataURL('image/jpeg'); //转换图片为dataURL
      callback ? callback(dataURL) : null; //调用回调函数
    };
  },
  dataURLtoFile: dataurl => {
    //将base64转换为文件,dataurl为base64字符串,filename为文件名(必须带后缀名,如.jpg,.png)
    var arr = dataurl.split(','),
      mime = arr[0].match(/:(.*?);/)[1],
      bstr = atob(arr[1]),
      n = bstr.length,
      u8arr = new Uint8Array(n);
    while (n--) {
      u8arr[n] = bstr.charCodeAt(n);
    }
    let filename = util.randString(8) + '.' + mime.split('/')[1];
    return new File([u8arr], filename, { type: mime });
  },

 3.递归部门列表

recursionDepartmentList: data => {
    for (let i = 0; i < data.length; i++) {
      if (data[i].childList && data[i].childList.length > 0) {
        data[i].label = data[i].organName;
        data[i].value = data[i].id;

        data[i].children = data[i].childList;
        util.recursionDepartmentList(data[i].children);
      } else {
        data[i].label = data[i].organName;
        data[i].value = data[i].id;
      }
    }
  }

4.返回时间(年月日)

returnYearMonthDateTime: date => {
    let year = date.getFullYear();
    let month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1;
    let dd = date.getDate() < 10 ? '0' + date.getDate() : date.getDate();
    let time = year + '-' + month + '-' + dd;
    return time;
  },
  // 返回时间(时分秒)
  returnHoursMinuteSecondTime: date => {
    let hours = date.getHours() < 10 ? '0' + date.getHours() : date.getHours();
    let minute = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes();
    let second = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds();
    let time = hours + ':' + minute + ':' + second;
    return time;
  },
  // 返回实时时间
  returnTime: () => {
    let date = new Date();
    let month = date.getMonth() + 1 > 9 ? date.getMonth() + 1 : '0' + (date.getMonth() + 1);
    let hours = date.getHours() > 9 ? date.getHours() : '0' + date.getHours();
    let minutes = date.getMinutes() > 9 ? date.getMinutes() : '0' + date.getMinutes();
    let seconds = date.getSeconds() > 9 ? date.getSeconds() : '0' + date.getSeconds();
    return date.getFullYear() + '-' + month + '-' + date.getDate() + ' ' + hours + ':' + minutes + ':' + seconds;
  },
  // 时分秒转时间戳
  returnTimeStamp: time => {
    const date = new Date();
    date.setHours(0, 0, 0, 0);
    const timestamp = date.getTime();

    var s = 0;
    var hour = time.split(':')[0];
    var min = time.split(':')[1];
    var sec = time.split(':')[2];
    s = Number(hour * 3600000) + Number(min * 60000) + Number(sec * 1000);
    return s + timestamp;
  }

5.中文与数字相关 

CheckChinese: val => {
    var reg = new RegExp('[\\u4E00-\\u9FFF]+', 'g');
    return reg.test(val);
  },
  // 数字转中文
  numberToChina: index => {
    let chinaArray = ['', '一', '二', '三', '四', '五', '六', '七', '八', '九', '十'];
    switch (index) {
      case 1:
        return chinaArray[1];
      case 2:
        return chinaArray[2];
      case 3:
        return chinaArray[3];
      case 4:
        return chinaArray[4];
      case 5:
        return chinaArray[5];
      case 6:
        return chinaArray[6];
      case 7:
        return chinaArray[7];
      case 8:
        return chinaArray[8];
      case 9:
        return chinaArray[9];
      case 10:
        return chinaArray[10];
      default:
        return '';
    }
  },

 6.GIS相关计算

 

// 返回最大经纬度以及最小经纬度
  returnMaxMinLngMaxMinLat: data => {
    let maxLng = Math.max(...data.map(item => item.coordinate.longitude));
    let minLng = Math.min(...data.map(item => item.coordinate.longitude));
    let maxLat = Math.max(...data.map(item => item.coordinate.latitude));
    let minLat = Math.min(...data.map(item => item.coordinate.latitude));

    return { maxLng: maxLng, minLng: minLng, maxLat: maxLat, minLat: minLat };
  },
  recursionRouter: (menuMap, menuChildList) => {
    menuMap.forEach(menu => {
      menuChildList.push(menu);
      if (menu.childList) {
        util.recursionRouter(menu.childList, menuChildList);
      }
    });
  },
  // 计算两个经纬度之间的角度(0-360)
  getAngle: (lng_a, lat_a, lng_b, lat_b) => {
    var a = ((90 - lat_b) * Math.PI) / 180;
    var b = ((90 - lat_a) * Math.PI) / 180;
    var AOC_BOC = ((lng_b - lng_a) * Math.PI) / 180;
    var cosc = Math.cos(a) * Math.cos(b) + Math.sin(a) * Math.sin(b) * Math.cos(AOC_BOC);
    var sinc = Math.sqrt(1 - cosc * cosc);
    var sinA = (Math.sin(a) * Math.sin(AOC_BOC)) / sinc;
    var A = (Math.asin(sinA) * 180) / Math.PI;
    var res = 0;
    if (lng_b > lng_a && lat_b > lat_a) res = A;
    else if (lng_b > lng_a && lat_b < lat_a) res = 180 - A;
    else if (lng_b < lng_a && lat_b < lat_a) res = 180 - A;
    else if (lng_b < lng_a && lat_b > lat_a) res = 360 + A;
    else if (lng_b > lng_a && lat_b == lat_a) res = 90;
    else if (lng_b < lng_a && lat_b == lat_a) res = 270;
    else if (lng_b == lng_a && lat_b > lat_a) res = 0;
    else if (lng_b == lng_a && lat_b < lat_a) res = 180;
    return res;
  },
  // 通过角度算方向
  calculationDirection: (angle, comefromValue, toValue, comfromDirectionList, toDirectionList) => {
    comefromValue = '';
    toValue = '';

    if (angle > 22.5 && angle <= 67.5) {
      comefromValue = '西南';
      toValue = '东北';
    } else if (angle > 67.5 && angle <= 112.5) {
      comefromValue = '西';
      toValue = '东';
    } else if (angle > 112.5 && angle <= 157.5) {
      comefromValue = '西北';
      toValue = '东南';
    } else if (angle > 157.5 && angle <= 202.5) {
      comefromValue = '北';
      toValue = '南';
    } else if (angle > 202.5 && angle <= 247.5) {
      comefromValue = '东北';
      toValue = '西南';
    } else if (angle > 247.5 && angle <= 292.5) {
      comefromValue = '东';
      toValue = '西';
    } else if (angle > 292.5 && angle <= 337.5) {
      comefromValue = '东南';
      toValue = '西北';
    } else {
      comefromValue = '南';
      toValue = '北';
    }

    if (
      !comfromDirectionList.find(item => {
        return item.value === comefromValue;
      }) ||
      !toDirectionList.find(item => {
        return item.value === toValue;
      })
    ) {
      comefromValue = '';
      toValue = '';
    }

    return { comefromValue: comefromValue, toValue: toValue };
  },
  // 通过角度返回方向
  returnDirection: angle => {
    if (angle > 22.5 && angle <= 67.5) {
      return '东北';
    } else if (angle > 67.5 && angle <= 112.5) {
      return '东';
    } else if (angle > 112.5 && angle <= 157.5) {
      return '东南';
    } else if (angle > 157.5 && angle <= 202.5) {
      return '南';
    } else if (angle > 202.5 && angle <= 247.5) {
      return '西南';
    } else if (angle > 247.5 && angle <= 292.5) {
      return '西';
    } else if (angle > 292.5 && angle <= 337.5) {
      return '西北';
    } else {
      return '北';
    }
  },
  // 通过角度返回序号
  returnDirectionNumber: angle => {
    if (angle > 22.5 && angle <= 67.5) {
      return '1';
    } else if (angle > 67.5 && angle <= 112.5) {
      return '2';
    } else if (angle > 112.5 && angle <= 157.5) {
      return '3';
    } else if (angle > 157.5 && angle <= 202.5) {
      return '4';
    } else if (angle > 202.5 && angle <= 247.5) {
      return '5';
    } else if (angle > 247.5 && angle <= 292.5) {
      return '6';
    } else if (angle > 292.5 && angle <= 337.5) {
      return '7';
    } else {
      return '0';
    }
  },

7.深拷贝 

//深度合并-深拷贝,参数同Objec.assign
function deepMerge(obj1, obj2) {
  let key;
  for (key in obj2) {
    // 如果target(也就是obj1[key])存在,且是对象的话再去调用deepMerge,否则就是obj1[key]里面没这个对象,需要与obj2[key]合并
    // 如果obj2[key]没有值或者值不是对象,此时直接替换obj1[key]
    obj1[key] =
      obj1[key] &&
        obj1[key].toString() === "[object Object]" &&
        (obj2[key] && obj2[key].toString() === "[object Object]")
        ? deepMerge(obj1[key], obj2[key])
        : (obj1[key] = obj2[key]);
  }
  return deepClone(obj1)
}
//深拷贝
function deepClone(obj) {
  //判断拷贝的要进行深拷贝的是数组还是对象,是数组的话进行数组拷贝,对象的话进行对象拷贝
  var objClone = Array.isArray(obj) ? [] : {};
  //进行深拷贝的不能为空,并且是对象或者是
  if (obj && typeof obj === "object") {
    let key;
    for (key in obj) {
      if (Object.hasOwnProperty.call(obj, key)) {
        if (obj[key] && typeof obj[key] === "object") {
          objClone[key] = deepClone(obj[key]);
        } else {
          objClone[key] = obj[key];
        }
      }
    }
  }
  return objClone;
}

8.防抖 

//防抖
function debounce(fn, delay = 1000) {
  let timeout
  return function () {
    clearTimeout(timeout);
    timeout = setTimeout(() => {
      fn.call(this, arguments);

    }, delay);
  };
}

 PS:文中所述方法如果有什么问题,或者同行伙伴们有什么好的方法和建议,都可以再评论区提出来,此贴将会持续更新和完善,让我们一起成长!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值