javascript项目开发中的常用公共方法

本篇文章纯属干货,包含了笔者在实际项目开发中经常用到的一些公共通用方法,希望可以帮助大家。

部分方法适用ReactNative
import {
    PixelRatio,
    Dimensions,
    Platform,
    findNodeHandle,
    UIManager
} from 'react-native';

/**
 * 日期格式化函数
 * @param {} date 
 */

function formatNumber(n) {
    n = n.toString()
    return n[1] ? n : '0' + n
}

export function formatDate(date, type) {
    var year = date.getFullYear()
    var month = date.getMonth() + 1
    var day = date.getDate()

    var hour = date.getHours()
    var minute = date.getMinutes()
    var second = date.getSeconds()

    if (type = 'YYYY-MM-DD') {
        return [year, month, day].map(formatNumber).join('-')
    }
    else {
        return [year, month, day].map(formatNumber).join('-') + ' ' + [hour, minute, second].map(formatNumber).join(':')
    }
}



//获取设备屏幕的实际宽度

export const deviceW = Dimensions.get('window').width;
export const deviceH = Dimensions.get('window').height;


// 设置自适应字体,以iphone6为例
const basePx = 375

export function px2dp(px) {
    return px * deviceW / basePx
}

/**
 * 判断是否为iphoneX
 * @returns {boolean}
 */
 
const X_WIDTH = 375;
const X_HEIGHT = 812;

export function isIphoneX() {
    return (
        Platform.OS === 'ios' &&
        ((deviceH >= X_HEIGHT && deviceW >= X_WIDTH) ||
            (deviceH >= X_WIDTH && deviceW >= X_HEIGHT))
    )
}


/**
 * 根据是否是iPhoneX返回不同的样式
 * @param iphoneXStyle
 * @param iosStyle
 * @param androidStyle
 * @returns {*}
 */

export function ifIphoneX(iphoneXStyle, iosStyle, androidStyle) {
    if (isIphoneX()) {
        return iphoneXStyle;
    } else if (Platform.OS === 'ios') {
        return iosStyle
    } else {
        if (androidStyle) return androidStyle;
        return iosStyle
    }
}


//判断设备是否是ios平台
export const isIphone = Platform.OS == 'ios' ? true : false

/** 
 * 返回精确的n位小数数值
 * @param num:number
 * @param dig:number
*/

export function digitToFixed(num, digit = 2) {
	// NaN,undefined,空值
    if (typeof (num) == 'undefined') {
        return '0.00'
    }
    else {
        return parseFloat(num).toFixed(digit)
    }
}

/** 
 * 返回账户金额,每隔三位数字添加一个逗号
 * @param str:string

*/

export function threeNumberAPointer(str) {
    return parseFloat(str).toFixed(2).replace(/\d(?=(?:\d{3})+\b)/g, `$&,`)
}

/**
 * 将银行卡末尾n位数字截取出来
 *  @param cardCode:string 银行卡号
 *  @param digit:num  截取长度
*/

export function bankCardLastNum(cardCode, digit = 4) {
    return cardCode.substring(cardCode.length - digit, cardCode.length)
}

/**
*获取react-native-element元素的宽度和高度等信息
* @param ref:ref 组件ref
*/

export function getRnElementInfo(ref) {
    const handle = findNodeHandle(ref);
    return new Promise((resolve) => {
        UIManager.measure(handle, (x, y, width, height, pageX, pageY) => {
            resolve({
                x,
                y,
                width,
                height,
                pageX,
                pageY
            });
        });
    });
}

/** 
 * 返回银行卡号,每隔四个数字添加一个空格
 * @param str:string

*/
export function formatBankCard(str) {
    let newStr = str.replace(/\d(?=(?:\d{4})+\b)/g, `$& `);
    return String(newStr)
}

//判断参数的类型

const Types = {

  isPrototype( data ) {
    return Object.prototype.toString.call(data).toLowerCase()
  },

  isArray( data ) {
    return this.isPrototype( data ) === '[object array]'
  },

  isJSON( data ) {
    return this.isPrototype( data ) === '[object object]'
  },

  isFunction( data ) {
    return this.isPrototype( data ) === '[object function]'
  },

  isString( data ) {
    return this.isPrototype( data ) === '[object string]'
  },

  isNumber( data ) {
    return this.isPrototype( data ) === '[object number]'
  },

  isUndefined( data ) {
    return this.isPrototype( data ) === '[object undefined]'
  },

  isNull( data ) {
    return this.isPrototype( data ) === '[object null]'
  }

}

/*
 * @desc 按照给定参数类型对数组进行排序
 * 使用方法 Array.sort(sortBy(param,1))
 * @param {string} attr 需要进行排序的属性
 * @param {any} rev 进行升序还是降序排列
*/
export function sortBy(attr, rev) {
    //第二个参数没有传递 默认升序排列
    if (rev == undefined) {
        rev = 1;
    } else {
        rev = (rev) ? 1 : -1;
    }

    return function (a, b) {
        a = a[attr];
        b = b[attr];
        if (a < b) {
            return rev * -1;
        }
        if (a > b) {
            return rev * 1;
        }
        return 0;
    }
}

/**
 *  @desc 通过指定key 使用reduce方法对数组去重并返回新数组
 *  使用方法 newArr = singleArray(oldArr,label)
 *  @param {array} arr 需要进行去重的数组
 *  @param {string} label 数组中唯一的key标识
*/
 export function singleArray(arr, label) {
    let obj = {}
    return arr.reduce(function (item, next) {
      let key = next[label]
      obj[key] ? '' : obj[key] = true && item.push(next)
        return item
  },[])
}
/*
 * @desc 返回数字的n! 排列可能性
 * 使用方法 factorial(5)——————>5*4*3*2*1 = 120
 * @param {number} n 需要获取的数字值
*/
export function factorial(n) {
  return n ? n * factorial(n - 1) : 1;
}

/* @desc 返回数字的组合值 
 * 使用方法 combination(5,4)————————>5*4*3*2*1/4*3*2*1 = 5
 * @param {number} m 下标 
 * @param {number} n 上标
*/
export function combination(m, n) {
   if (n == 1 || (m - n) == 1) {
      return m
   }
   return factorial(m) / factorial(m - n)
}
/*
 * @desc 字符串翻转
 * 使用方法 reverseStr(str)
 * @param {string} str 需要转化的字符串
*/
export function reverseStr(str){
   str = str.toString()
   //转化为数组 然后翻转 然后转化为字符串
   return str.split('').reverse().join('')
}

/*
 * @desc 回文算法 指一个字符串忽略标点符号、大小写和空格,正着读和反着读一模一样。
 * 使用方法 palindrome(str) ——————>palindrome("eye") true
 * @param {string} str 需要判断的字符串
*/
export function palindrome(str) {
   //正则含意 \w 为删除所有非字母数字字符 _ 匹配下划线 | 
   str = str.toLowerCase().replace(/_|\W/gi,'')
   return str === reverseStr(str)
}

/**
* @desc 寻找最长的单词算法 
* @return number 
* 使用方法 findLongestWord(str) 
* @param {string} str 需要处理的字符串
* @param {string} reg 字符串切割的方式
*/
function findLongestWord(str,reg = ' ') {
  return str.split(reg).reduce((sum, current) => {
     return Math.max(sum, current.length)
  }, 0)
}
/**
 * @desc 设置首字母大写算法
 * @return string
 * 使用方法 titleCase(str)
 * @param {string} str 需要转化的字符串
*/
function titleCase(str) {
    return str.toLowerCase().split(/\s+/).reduce(function(prev, item) {  
        return prev + (prev.trim() && ' ') + item.slice(0, 1).toUpperCase() + item.slice(1);  
    }, '');  
}
/**
 * @desc 寻找数组中的最大值算法挑战
 * @return array
 * 使用方法 largestOfFour(arr)
 *  largestOfFour([
 *    [4, 5, 1, 3],
 *    [13, 27, 18, 26],
 *    [32, 35, 37, 39],
 *    [1000, 1001, 857, 1]
 *  ]);————————> [5, 27, 39, 1001]
 * @param {array} arr 二维数组
*/
function largestOfFour(arr) {
  let newArr = []
  for (let value of arr){
     newArr.push(value.sort((a,b)=>b-a)[0])
  }
  return newArr
}

/**
 * @desc 确认末尾字符算法 检查一个字符串(str)是否以指定的字符串(target)结尾。
 * @return boolean
 * 使用方法 confirmEnding(str,target)
 * @param {string} str 需要确认的母字符串
 * @param {string} target 用来匹配的子串
*/
export function confirmEnding(str, target) {
   let lastStr = str.slice(str.length - target.length)
   return target === lastStr;
}
/**
 * @desc 重复操作算法 循环拼接一个指定的字符串 num次,如果num是一个负数,则返回一个空字符串。
 * @return string
 * 使用方法 repeat(str,num)
 * @param {string} str 需要重复的字符串
 * @param {number} num 需要重复的次数
*/
export function repeat(str, num) {
   let _str = str
   if(Number(num) < 0 ){
      return ''
   }
   new Array(num-1).fill(1).map(item=>_str+=str)
    return _str         
}
/**
 * @desc 字符串截取算法  如果字符串的长度比给定的参数num长,则把多余的部分用...来表示。
 * 切记,插入到字符串尾部的三个点号也会计入字符串的长度。
 * 然而,如果指定的参数num小于或等于3,则添加的三个点号不会计入字符串的长度。
 * @return string
 * 使用方法 truncate(str,num)
 * @param {string} str 母字符串
 * @param {number} num 判断截取的长度
*/
export function truncate(str, num) {
  let rep = '...',len = 0
  if(num >= str.length){
      return str
  }
  if(num >3){
     len = 3
  }
  return str.slice(0,num - len)+rep;
}
/**
 * @desc 数组分割算法 把一个数组arr按照指定的数组大小size分割成若干个数组块。
 * @return array ————————>chunk([1,2,3,4],2)=[[1,2],[3,4]];
 * 使用方法 chunk(str,num)
 * @param {array} arr 被截取的数组
 * @param {number} size 截成几个子数组
*/
export function chunk(arr, size) {
  const newArr = []
  let tmpArr = []
  arr.forEach((item,index) => {
      tmpArr.push(item)
      if((index+1) % size === 0 || index == arr.length - 1){
         newArr.push(tmpArr)
         tmpArr = []
      }
  })
return newArr
}
/**
 * @desc 数组截断算法 返回一个数组被截断n个元素后还剩余的元素,从索引0开始截断。
 * @return array ————————>slasher([1, 2, 3], 2) = 3;
 * 使用方法 slasher(str,num)
 * @param {array} arr 被截取的数组
 * @param {number} size 截去几个元素
*/
export function slasher(arr, howMany) {
  if(!howMany){
     return arr
   }
  if(howMany > arr.length){
     return []
   }
   return arr.slice(howMany)
}
/**
 * @desc 数组查询算法 如果数组第一个字符串元素包含了第二个字符串元素的所有字符,则函数返回true。(忽略大小写)
 * @return boolean ————————>mutation(["hello", "hey"]) = false;
 * 使用方法 mutation(arr1,arr2)
 * @param {array} arr 判断的数组数据
*/
export function mutation(arr) {
  let pArr = arr[0]
  let cArr = arr[1]
  let count = 0
    for(let val of cArr){
      if(pArr.indexOf(val.toLowerCase()) > -1 || pArr.indexOf(val.toUpperCase()) > -1){
        count++
    }
  }
  return count == cArr.length
}
/**
 * @desc 删除数组中的所有的假值。 
 * @return array ————————>bouncer([7, "ate", "", false, 9]) = [7, "ate", 9];
 * 使用方法 bouncer(arr)
 * @param {array} arr 判断的数组数据
*/
export function bouncer(arr) {
  return arr.filter(item=>!!item);
}
/**
 * @desc 去除数组中任意多个值算法。
 * @return array ————————>destroyer([1, 2, 3, 1, 2, 3], 2, 3) = [1, 1];
 * 使用方法 destroyer(arr)
 * @param {array} arr 数组数据
*/
export function destroyer(arr) {
    //arguments是保存当前函数所有的参数的类数组对象
    //遍历参数数组,与初始数组的每个元素进行比较,返回初始数组中不同的元素
    for (var i = 1; i < arguments.length; i++) {
        arr = arr.filter(item=>arguments[i] !== item)
    }
    return arr
}
/**
 * @desc 数组排序并插入值算法。先给数组排序,然后找到指定的值在数组的位置,最后返回位置对应的索引。
 * @return number ————————>where([5, 3, 20, 3], 5) = 2;
 * 使用方法 where(arr,num)
 * @param {array} arr 数组数据
 * @param {number} num 需要比较的元素
*/
export function where(arr, num) {
   arr.push(num);
   return arr.sort((a, b) => a - b).findIndex(item => item == num);
}
/**
 * @desc 位移密码算法。移位密码也就是密码中的字母会按照指定的数量来做移位。写一个ROT13函数,实现输入加密字符串,输出解密字符串。
 * @return string ————————>rot13("SERR CVMMN!") = "FREE PIZZA!";
 * 使用方法 where(arr,num)
 * @param {string} str 需要解密的字符串
*/
export function rot13(str) {
    //定义一个数组,用来存放解密后的字符
    var newArr = [];
    //遍历参数字符串
    for (var i = 0; i < str.length; i++) {
         // 非字母形式的字符,直接跳过,存入数组newArr中
       if (str.charCodeAt(i) < 65 || str.charCodeAt(i) > 90) {
          newArr.push(str.charAt(i));
       } else if (str.charCodeAt(i) > 77) {
           // 后13个大写字母,减去13
           newArr.push(String.fromCharCode(str.charCodeAt(i) - 13));
       } else {
           // 前13个大写字母,加上13 
           newArr.push(String.fromCharCode(str.charCodeAt(i) + 13));
        }
      }
 return newArr.join("");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值