一些常用的工具函数

2020/01/13 功能实现 共 3011 字,约 9 分钟

积累常用的工具函数

收集在项目中自己常用的工具函数,尝试自己动手实现,理清逻辑。不直接复用或者网上炒,慢慢积累,形成自己的工具库,可以不借助第三,自己手把手实现功能

  1. 实现千分位的分割
function format(num){
  let arr = []
  let str = String(num)
  for(let i=0,j=1;i<str.length;i++,j++){
    arr.push(str[i])
    if(j%3===0&&i!=str.length-1){
      arr.push(',')
    }
  }
  return arr.join('')
}

// 或者使用
let a = 8462948988.24;
a.toLocaleString();
  1. 二分法查找目标数据
function search(list, target) {
  let start = 0
  let end = list.length - 1
  if (end === 0) {
    return '数组长度是 0'
  }
  while (start <= end) {
    let mid = parseInt(start + (end - start) / 2)
    if (list[mid] > target) {
      console.log(mid, end, 2);
      end = mid - 1
    } else if (list[mid] < target) {
      console.log(mid, end, 3);
      start = mid + 1
    }
    if (list[mid] === target) {
      console.log(mid, end, 4);
      return mid
    }
    return -1
  }
}
  1. 平铺二维数组
let arr = [[1,2,3],[4,5,6]]
[].concat(...arr)

function flatten(arr){
  return [].concat(arr.map(item=>{
    return Array.isArray(item)?flatten(item):item
  }))
}
  1. 数组浅拷贝
var shallowCopy = function (obj) {
  //只能拷贝对象
  if (typeof obj !== 'object') return
  var newObj = obj instanceof Array ? [] : {}
  for (var key in obj) {
    if (obj.hasOwnProperty(key)) {
      newObj[key] = obj[key]
    }
  }
  return newObj
}
  1. 深拷贝,利用函数必包
var deepCopy = function (obj) {
  if (typeof obj !== 'object') return
  var newObj = obj instanceof Array ? [] : {}
  for (let key in obj) {
    if (obj.hasOwnProperty(key)) {
      newObj[key] = typeof obj[key] === 'object' ? deepCopy(obj[key]) : obj[key]
    }
  }
  return newObj
}
  1. 时间戳转化是指定格式
Number.prototype.format = function (fmt="yyyy-MM-dd hh:mm") {
    let date = new Date(Number(this));
    var o = {
      "M+": date.getMonth() + 1, //月份 
      "d+": date.getDate(), //日 
      "h+": date.getHours(), //小时 
      "m+": date.getMinutes(), //分 
      "s+": date.getSeconds(), //秒 
    };
    if (/(y+)/.test(fmt)) {
      fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
    }
    for (var 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;
  }
  1. 时间戳显示为多少分钟前,多少天前的处理
      /*
    ** 时间戳显示为多少分钟前,多少天前的处理
    ** eg.
    ** console.log((1411111111111).convertTime());  // 2014年09月19日
    ** console.log((1481111111111).convertTime());  // 9月前
    ** console.log((1499911111111).convertTime());  // 2月前
    ** console.log((1503211111111).convertTime());  // 3周前
    ** console.log((1505283100802).convertTime());  // 1分钟前
    */
    Number.prototype.convertTime = function () {
     // 使用13位毫秒时间戳
     var timestamp = Number(String(this).padEnd(13, '0'));
    
     // 这是一些常量
     var minute = 1000 * 60;
     var hour = minute * 60;
     var day = hour * 24;
     var month = day * 30;
    
     // 偏差时间
     var diffValue = new Date().getTime() - timestamp;
     // 是否是过去
     var isLast = diffValue > 0;
    
     // 表示尚未结束
     diffValue = Math.abs(diffValue);
    
     // 计算差异时间的量级
     var monthC = diffValue / month;
     var weekC = diffValue / (7 * day);
     var dayC = diffValue / day;
     var hourC = diffValue / hour;
     var minC = diffValue / minute;
    
     // 数值补0方法
     var zero = function (value) {
         if (value < 10) {
             return '0' + value;
         }
         return value;
     };
    
     // 返回的值
     var value = '';
    
     if (monthC > 12) {
         var date = new Date(timestamp);
         if (isLast) {
             value = date.getFullYear() + '年' + zero(date.getMonth() + 1) + '月' + zero(date.getDate()) + '日';
         } else {
             value = date.getFullYear() + '年';
         }
     } else {
         if (monthC >= 1) {
             value = parseInt(monthC) + '月';
         } else if (weekC >= 1) {
             value = parseInt(weekC) + '周';
         } else if (dayC >= 1) {
             value = parseInt(dayC) + '天';
         } else if (hourC >= 1) {
             value = parseInt(hourC) + '小时';
         } else if (minC >= 1) {
             value = parseInt(minC) + '分钟';
         }
    
         if (value) {
           return  isLast ? `${value}前` : `${value}后`;
         }
     }
    
     return isLast ? '刚刚' : '即将';
    };
    

在技术的历史长河中,虽然我们素未谋面,却已相识已久,很微妙也很知足。互联网让世界变得更小,你我之间更近。

在逝去的青葱岁月中,虽然我们未曾相遇,却共同经历着一样的情愫。谁的青春不曾迷茫或焦虑亦是无奈,谁不曾年少过

在未来的日子里,让我们共享好的文章,共同学习进步。有不错的文章记得分享给我,我不会写好的文章,所以我只能做一个搬运工

我叫 sunseekers(张敏) ,千千万万个张敏与你同在,18年电子商务专业毕业,毕业后在前端搬砖

如果喜欢我的话,恰巧我也喜欢你的话,让我们手拉手,肩并肩共同前行,相互学习,互相鼓励

文档信息

Search

    Table of Contents