react-native-gp-utils(對react-native全局進行配置,對內置對象原型鏈增加方法,增加常用全局方法.)...

react-native-gp-utils

對react-native全局進行配置,對內置對象原型鏈增加方法,增加常用全局方法.

每次新建react-native項目之後都會發現有一些很常用的方法在這個項目中也會用到,有些對全局的配置(禁用模擬器上顯示黃框,release發佈版本中時console打印失效等).這些如果在新項目中在搞一次的話的確是很麻煩,所以我就將其封裝成了這個庫.

github地址: https://github.com/geek-prince/react-native-gp-utils

npm地址: https://www.npmjs.com/package/react-native-gp-utils

[TOC]

安裝

npm install react-native-gp-utils --save

如何使用

首先導入插件

三種侵入式等級(根據情況選擇其中一種方式導入)

  • 0:非侵入式:每個要用到的方法的文件中都要導入指定的工具類,並以工具類.方法名的方式調用方法.

    • 優點:不會佔用任何一個全局變量和任何一個內建對象(Array,String對象等)的prototype原型鏈屬性,不會造成全局變量污染
    • 缺點:每個要使用的文件都要導入相應的庫文件,不方便
  • 1:部分侵入式(推薦):只用在入口文件中導入一次即可,並以工具類.方法名方式調用方法,內建對象以arr.unshiftFromIndex的形式調用.

    • 優點:相對方便,只用入口文件導入一次,其他文件都可以使用.
    • 缺點:會佔用與各個工具類名相同的全局變量的屬性(也可把各個工具類名定義爲自定義的變量名),以及各個內建對象(Array,String對象等)的prototype原型鏈的與方法名相同的屬性
  • 2:完全侵入式:只用在入口文件中導入一次即可,並以方法名方式直接調用方法,內建對象以arr.unshiftFromIndex的形式調用.

    • 優點:非常方便,在入口文件中導入一次即可,在任何地方使用任何方法,只用直接用方法名就可以調用方法.
    • 缺點:會佔據各個工具類中所有和方法名相同的全局變量(會造成全局變量污染),和各個內建對象(Array,String對象等)的prototype原型鏈的與方法名相同的屬性

三種侵入式等級分別導入插件的方式

導入庫->設置配置選項(可選)->自定義各個庫文件名(可選,在侵入式等級1中使用)->給出侵入式等級初始化

1.導入庫

import GPUtils from 'react-native-gp-utils';

2.設置配置選項(可選)

GPUtils.configs={yellowBoxOn:true}; //這裏設置打開警告提示黃框

3.自定義各個庫文件名(可選,在侵入式等級1中使用)

//這裏表示將CommonUtils,ArrayUtils工具類的名稱分別自定義爲CU,AU,沒給出的按默認的工具類的名稱.
GPUtils.namesMap={CommonUtils:'CU',ArrayUtils:'AU'};

4.給出侵入式等級初始化

4.1.以侵入式等級0初始化
// let {CommonUtils,ArrayUtils}=GPUtils.initWtihInvadeScale(0);
// 也可以向下面這樣爲之自定義名稱
let {CommonUtils:CU,ArrayUtils:AU}=GPUtils.initWtihInvadeScale(0);
4.2.以侵入式等級1初始化(推薦)
GPUtils.initWtihInvadeScale(1); //自定義名稱在上面第3步
4.3.以侵入式等級2初始化
GPUtils.initWtihInvadeScale(2); //完全侵入,不支持自定義名稱(因爲每個方法名都會成爲全局變量)

可配置選項(上面第2步)

配置項 說明 默認值
yellowBoxOn 指定警告黃框(即在打印warn警告信息時,模擬器先放出現的警告黃框)是否開啓 false:關閉(系統默認是開啓)
releaseLogOn 指定是否在release發佈版本中打印log的信息(release版本中系統默認是不會將console.log打印除去的,但是又不可能發佈前特地刪一次所有註釋,所以直接導入庫就行了,默認就會在release版本清除log打印) false:關閉release版本中的打印

拓展的工具類及其對應的功能

方法的四種類型,下面會有解釋

  • CommonUtils:一些全局都可能用到的常用方法(裏面全部爲normal:普通方法)
  • MathUtils:一些和計算相關的方法(裏面全部爲normal:普通方法)
  • RNUtils:對react-native組件api的簡單封裝,常用值的導出,適配問題的一些處理(裏面全部爲normal:普通方法,與普通屬性變量)
  • RegExpUtils:一些和正則相關的方法(裏面全部爲normal:普通方法)
  • RandomUtils:一些和隨機相關的方法(裏面全部爲normal:普通方法)
  • 內建對象的工具類:
    • ArrayUtils:對內建對象Array拓展的相關方法(裏面的方法全部爲baseOnInvadeScale)
    • DateUtils:對內建對象Date拓展的相關方法(裏面方法有普通方法,也有both類型)
    • NumberUtils:對內建對象Number拓展的相關方法(裏面的方法全部爲onlyProto)
    • ObjectUtils:對內建對象Object拓展的相關方法(本來在Object的原型鏈上加方法會使調用很簡便,但是這樣的做法被rn拒絕了,所以這裏面的方法都是normal:普通方法)
    • StringUtils:對內建對象String拓展的相關方法(裏面方法有baseOnInvadeScale類型,也有onlyProto類型,也有both類型)
  • 其他方面的工具類:
    • FileUtils:一些和文件相關的方法(裏面的方法都是normal:普通方法)
    • DebugUtils:一些在開發或調試中要到的方法(裏面的方法都是normal:普通方法)

三種侵入式導入調用四種類型方法的方式

四種類型的方法

  • 1.normal:普通方法.直接調用的方法.
  • 2.baseOnInvadeScale:依據侵入式等級來決定.侵入式非0時提供prototype原型鏈方法,但是在侵入式爲0的方法導入時爲了不佔用原型鏈中的屬性,這類方法在侵入式0中調用方式與普通方法一致,第一的參數就是要進行操作的該對象本身
  • 3.both:同時提供prototype原型鏈的方法和與之對應的方法.這類方法在侵入式等級爲0時提供一個普通方法.侵入式等級爲非0時會提供2種方法,一種是直接在寫在內建對象的原型鏈上的方法,一種是與之對應的普通方法
  • 4.onlyProto:只提供prototype原型鏈的方法.侵入式爲0時這些方法就不存在了.

四種類型的方法在三種侵入式等級下分別的調用方式

所有方法的詳細介紹在下面,這裏先用其中幾個方法介紹一下調用方式

normal:普通方法.(以CommonUtils中的loop方法(統一管理循環,遍歷的方法)爲例)

  • 侵入式0的調用方式:
//按照上面方法導入之後
CommonUtils.loop(10,(i)=>{console.log(i)}); //輸出0到9
//可以自定義別名導入,這時的調用方式就位(所有方法類型都可以自定義別名,侵入式1也一樣,下面就不累贅寫以別名方式調用的內容了)
let {CommonUtils:CU}=GPGlobal.initWtihInvadeScale(0);
CU.loop(10,(i)=>{console.log(i)});
  • 侵入式1的調用方式:
//和上面侵入式0調用方式一樣,只是會佔用對應的全局變量
  • 侵入式2的調用方式:
loop(10,(i)=>{console.log(i)}); //直接方法名調用

baseOnInvadeScale類型.(以ArrayUtils中的unshiftFromIndex方法(將數組中指定索引的元素移動到最前面去)爲例)

  • 侵入式0的調用方式:
let arr=[1,2,3,4,5];
ArrayUtils.unshiftFromIndex(arr,1,3); //結果爲[2, 1, 3, 4, 5] 將所因爲3的元素移到最前面
  • 侵入式1和侵入式2的調用方式:
let arr=[1,2,3,4,5];
arr.unshiftFromIndex(1,3); //因爲是數組原型鏈上的方法,所以直接這樣調用,而且相對於侵入式0的滴啊用方法,也少了第一個參數(即當前這個數組),

both類型.(以DateUtils中的getDateDiff方法(計算兩個日期時間之間的差值)爲例)

  • 侵入式0的調用方式:
let startTimeStr='2017-11-11 11:11:11';
let endTimeStr='2017-11-12 10:10:10';
DateUtils.getDateDiff(startTimeStr,endTimeStr); //結果爲1
  • 侵入式1的調用方式:
//侵入式1提供兩種方法,一種是普通方法,調用方式就和上面的侵入式0的調用方式一樣;一種是原型鏈上的方法(向下面這樣調用)
let startTimeStr='2017-11-11 11:11:11';
let date=DateUtils.getDateObj(startTimeStr); //這個方法用於通過字符串,時間戳獲得一個日期對象,date此時就爲日期對象,詳情看下面的介紹.
let endTimeStr='2017-11-12 10:10:10';
date.diff(endTimeStr); //直接通過這種原型鏈方法的形式調用,爲了簡便,在原型鏈中的方法爲diff,both類型方法具體普通方法與原型鏈方法一不一致,看具體方法中的說明.
  • 侵入式2的調用方式
//普通方法和侵入式2在normal:普通方法的調用相同
//原型鏈方法和上面侵入式1的調用方式相同

onlyProto類型.(以NumberUtils中的toFloatStr方法爲例)

  • 侵入式1和侵入式2的調用方式(onlyProto類型的方法侵入式0中沒有):
let num=18.12345;
num.toFloatStr() //結果爲"18.12"

各個工具類中的方法

爲了方便,下面沒有特別說明都以侵入式等級2爲例講解,比較簡單的方法就不給出示例了

CommonUtils:一些全局都可能用到的常用方法(裏面全部爲normal:普通方法)

toStr(obj)

  • 說明:對obj對象調用Object最原始的toString方法
  • 示例:
toStr({})
// 返回"[object Object]"

判斷當前數據的類型的一些列方法:

isNumber(obj)

  • 說明:判斷obj是不是數字或Number對象,返回布爾值

isString(obj)

  • 說明:判斷obj是不是數字或String對象,返回布爾值

isBool(obj)

  • 說明:判斷obj是不是布爾類型,返回布爾值

isArray(obj)

  • 說明:判斷obj是不是數組類型,返回布爾值

isObj(obj)

  • 說明:判斷obj是不是對象類型,返回布爾值

isDate(obj)

  • 說明:判斷obj是不是日期對象類型,返回布爾值

isRegExp(obj)

  • 說明:判斷obj是不是RegExp正則對象類型,返回布爾值

getNewObj(obj)

  • 說明:獲得一個全新的和obj值一樣的對象或數組(該方法也在ArrayUtils中被用到數組的原型鏈屬性deepCopy上)
  • 示例:
let arr=[1,2,3,4,5];
let copyArr=getNewObj(arr);
copyArr===arr
// 返回false,得到一個至完全相同單地址不同的數組

loop(obj,callBack)

  • 說明:對數組,對象進行遍歷,指定範圍進行for循環的統一循環方法
  • 參數:
    • obj:要循環的數組,對象,指定範圍的數字
    • callBack:每次循環要做的操作
  • 示例:
//對指定範圍進行循環
loop(10,(i)=>{console.log(i)}) //輸出0到9
//對數組進行循環
let arr=[1,2,3,4,5,6,7];
loop(arr,(i,k)=>{console.log(i,k)});//輸出數組中的每一個索引與其對應的值
//對對象進行循環
let obj={a:10,b:20,c:30};
loop(obj,(k,v)=>{console.log(k,v)})//輸出對象中的每一個鍵值對

//loop的回調函數中break,continue不可用,但是可以用return做出break,continue,return的操作
//break操作(比如,到5時退出,這時只需要return 1(這裏的1可以用任何一個無意義的,不是undefined的值就行)即可)
loop(10,(i)=>{
  if(i===5){return 1}
  console.log(i);// 打印出0到4
});
//continue操作(比如,到5時跳過此次循環,進行下一次循環,只需要return undefined即可)
loop(10,(i)=>{
  if(i===5){return undefined}
  console.log(i);// 打印出0-4,6-9
});
//return操作(比如返回i值,像正常return一樣返回即可,該返回值則爲loop方法的返回值,可以拿到返回值後做其他操作,也可以再繼續將該返回值再次return出去)
let result=loop(10,(i)=>{
  if(i===5){return i}
  console.log(i);// 打印0到4
});
console.log(result);//打印5
//可以繼續return出去,這樣就和正常for循環時的return一樣了
function test() {
  return loop(10,(i)=>{
    if(i===5){return i}
    console.log(i);// 打印0到4
  });
}
let result=test();
console.log(result);//打印5

getBool(obj)

  • 說明:根據傳入的參數返回布爾值.該方法將空數組[],空對象{},數值爲0的字符串'0',空白字符串' ',也列入false中.(自動轉布爾值的情況:0,NaN,null,undefined,''爲false,其他情況爲true)

getFuncName(args)

  • 說明:獲取當前調用方法的方法名(調用時getFuncName(arguments))(在es6下的部分方法中會報錯)(在DebugUtils中的logFuncName中會用到該方法)
  • 參數:
    • args:要打印方法名的方法的arguments,要在方法中將arguments當做參數傳進來(因爲rn中沒有arguments.caller)
  • 示例:
function Test() {
    console.log(getFuncName(arguments));
}
// 打印出Test

isNumeric(strNum,maxDecimalNum=null,ifTrim=true,positive=false)

  • 說明:判斷傳入參數是不是一個數字或一個字符串類型的數字(1 '37' 1.73 '21.43')(還可以指定判斷小數點後可以最多有多少位)
  • 參數:
    • strNum:傳入的要判斷的參數(數字,字符串)
    • maxDecimalNum:如果要限制最多小數位數時傳入的最多位數的數字參數(如果傳入的參數strNum的小數位數超過toFixed給定的值就返回false,沒超過返回true),0時限制爲只能是整數,null時爲無限制(只要是數字就行)(默認爲null)
    • ifTrim 判斷時是否忽略左右空格(默認爲true,忽略)
  • 特殊用法:可以用在用戶在輸入框TextInput中輸入數字之後的校驗與限制
isNumeric('123.6765')// 結果true
isNumeric('123.6765',2)// 結果false
isNumeric(' -234.67 ',2,)// 結果true
isNumeric(' -546.12 ',2,false)// 結果false
isNumeric(' -123.67 ',2,true,true);// 結果false
isNumeric(123.67,2,true,true);// 結果true

numToFixedLenStr(num,len=2,char='0')

  • 說明:將數字或字符串類型的數字前面加上'0'或指定的字符,到達指定的長度,並返回字符串(爲了方便調用,該方法被加入到NumberUtils和StringUtils中作爲Number與String對象的原型鏈方法,名稱爲toFixedLenStr,詳情看相應的方法說明)
  • 參數:
    • num 要轉化的數字或字符串類型的數字
    • len 最後輸出的字符串的長度(默認爲2)
    • char 指定填充數字前面的字符爲什麼,默認爲"0"
  • 示例:
numToFixedLenStr('8') //結果爲"08"
numToFixedLenStr('18',4) //結果爲"0018"
numToFixedLenStr('18',4,'*') //結果爲"**18"
numToFixedLenStr(18,4,'*') //可以是數字

MathUtils:一些和計算相關的方法(裏面全部爲normal:普通方法)

js精確的加減乘除(js對浮點數的運算會存在問題,無論加減乘除,所以加入這些方法).
這些方法在NumberUtils和MathUtils中都被加入到Number對象和String對象的原型鏈中了,名稱分別爲add,sub,mul,div,詳情看相應的方法說明.
方法中除了可以傳數字,也可以傳字符串類型的數字

accAdd(arg1,arg2)

  • 說明:精確加法函數,用來得到精確的加法結果
  • 示例:
12.4249+6.8 //結果爲19.224899999999998
accAdd(12.4249,6.8) //結果爲19.2248
accAdd('12.4249','6.8') //傳入參數也可以是字符串類型的數字,結果同上

accSub(arg1,arg2)

  • 說明:精確減法函數,用來得到精確的減法結果(arg1-arg2)
  • 示例:
10.3-9.2 //結果爲1.1000000000000014
accSub(10.3,9.2) //結果爲1.1

accMul(arg1,arg2)

  • 說明:精確乘法函數,用來得到精確的乘法結果
  • 示例:
0.7*8.1 //結果爲5.669999999999999
accMul(0.7,8.1) //結果爲5.67

accDiv(arg1,arg2)

  • 說明:精確除法函數,用來得到精確的除法結果(arg1除以arg2)
  • 示例:
5.67/8.1 //結果爲0.7000000000000001
accDiv(5.67,8.1) //結果爲0.7

dealWithFloatStr=(strNum,toFixed=2,type='round',inputType='both',returnType=true)

  • 說明:將一個字符串類型的數字(或數字類型的值)進行處理(保留小數後幾位,捨去部分是四捨五入,還是向上/向下取整)(爲了更方便的處理類似問題,這個方法在NumberUtils,StringUtils和ArrayUtils中都被相應的方法(toFloat,toFloatStr)用到,並加入到Number對象,String對象和Array對象的原型鏈中了,詳情看相應的方法說明.)
  • 參數:
    • strNum 要處理的字符串類型的數字(或數字類型的值)
    • toFixed 要保留的小數位數. 0爲不保留小數只取整數,null時爲保持原有小數位數(默認爲2)
    • type 是四捨五入,還是向上/向下取整. 'round'爲四捨五入;'up'或'ceil'爲向上取整;'sub'或'floor'爲向下取整. 向上/向下取整同時適用於小數 dealWithFloatStr('1321.123459',5,'sub') 執行後"1321.12345"
    • inputType 輸入的類型可以爲什麼. 'both'時數字或數字字符串都會進行處理;'num'時只會處理數字(此時傳入字符串的話會原樣返回);'str'時只會處理數字字符串(此時傳入數字的話會原樣返回).(默認爲both)
    • returnType 返回類型爲什麼. true時爲字符串,false時爲數字類型
  • 示例:
dealWithFloatStr('12.3456') //結果爲"12.35"
dealWithFloatStr('12.3456',1) //結果爲"12.3"
dealWithFloatStr('12.3456',1,'up') //結果爲"12.4"
dealWithFloatStr('12.3456',3,'sub') //結果爲"12.345"
dealWithFloatStr('12.3456',3,'sub','num') //結果爲"12.3456"
dealWithFloatStr(12.3456,3,'sub','num',false) //結果爲12.345

RNUtils:對react-native組件api的簡單封裝,常用值的導出,適配問題的一些處理(裏面全部爲normal:普通方法,與普通屬性)

一些常用屬性:

w

  • 說明:當前設備屏幕的寬度

h

  • 說明:當前設備的高度

isios

  • 說明:當前設備是不是iOS設備,布爾值

一些常用api的簡單封裝:

openUrl(url)

  • 說明:在瀏覽器中打開指定url的方法
  • 參數:
    • url:要打開的url

openPhone(phoneNum)

  • 說明:打開電話撥號界面,並在裏面填入phoneNum的電話號碼
  • 參數:
    • phoneNum:要在撥號界面填入的號碼

setClipboard(test)

  • 說明:設置一段文字到剪貼板

get(url,args={})

  • 說明:fetch方法以get方式請求json數據的簡單封裝
  • 參數:
    • url:url地址,即fetch的第一個參數
    • args:可選參數,fetch的第二個參數,可以用來定製 HTTP 請求一些參數。你可以指定 header 參數,或是指定使用 POST 方法,又或是提交數據等等
  • 示例:
get('http://baike.baidu.com/api/openapi/BaikeLemmaCardApi?scope=103&format=json&appid=379020&bk_key=%E9%93%B6%E9%AD%82&bk_length=600',)
    .then((jsonData)=>{
        console.log(jsonData);
    })
    .catch((error)=>{
        console.log(error);
    });

post(url,bodyData,headers={})

  • 說明:fetch方法以post方式請求json數據的簡單封裝
  • 參數:
    • url:url地址,即fetch的第一個參數
    • bodyData:post的body數據.可以是對象,在'Content-Type': 'application/json'時(默認是這個);可以是字符串,在'Content-Type': 'application/x-www-form-urlencoded'時.
    • headers:給出相應的頭部信息.
  • 示例:
//以'Content-Type': 'application/json'方式發送請求時
post('http://baike.baidu.com/api/openapi/BaikeLemmaCardApi',
    {scope:103,format:'json',appid:379020,bk_key:'銀魂',bk_length:600})
    .then((jsonData)=>{
        console.log(jsonData);
    })
    .catch((error)=>{
        console.log(error);
    });
//以'Content-Type': 'application/x-www-form-urlencoded'方式發送請求時,需要給出第三個參數headers
post('http://baike.baidu.com/api/openapi/BaikeLemmaCardApi',
    'scope=103&format=json&appid=379020&bk_key=銀魂&bk_length=600',
    {'Content-Type': 'application/x-www-form-urlencoded'})
    .then((jsonData)=>{
        console.log(jsonData);
    })
    .catch((error)=>{
        console.log(error);
    });

一些適配相關的方法:

setFontSize(fontSize)

  • 說明:根據像素密度設置字體大小(用於老版本的rn,老版本中相同字體大小在不同設備上會有問題,新版本的rn中則沒有該問題,忽略該方法)

RegExpUtils:一些和正則相關的方法(裏面全部爲normal:普通方法)

isPhoneNum(str)

  • 說明:檢驗手機號合理性(傳入的str字符串是不是手機號),返回布爾值

isEmail(str)

  • 說明:檢驗郵箱合理性(傳入的str字符串是不是郵箱),返回布爾值

pushRegExpKeyToArr(obj,reg)

  • 說明:將對象中的key或數組中的元素符合指定的正則表達的放入到數組中,並返回
  • 參數:
    • obj:傳入的對象或數組
    • reg:傳入的正則表達式
  • 示例:
let arr=['ro123ot','root','fdhfi','raew'];
pushRegExpKeyToArr(arr,/ro.*ot/);
// 返回["ro123ot", "root"]
// 如果傳入參數爲對象,則返回的數組中的元素是傳入對象鍵(key)中符合正則的的

RandomUtils:一些和隨機相關的方法(裏面全部爲normal:普通方法)

getRandom(num1,num2)

  • 說明:獲得隨機數.沒有傳num1和num2時,生成一個0-1的隨機數;只有num1的時候生成一個0-num1的int整形數;num1,num2都有時生成一個num1-num2的int整形隨機數.

getRandomNumStr(num1,num2)

  • 說明:和上面方法功能是一樣的,只是將返回結果轉換爲字符串而已

getRandomFromArr(arr)

  • 說明:從數組中獲得隨機的數組元素(每個元素權重相同,獲得概率相同)

getRandomFromArrWithWeight(arr,weightArr)

  • 說明:從數組中獲得隨機的數組元素(帶有比重的,每個元素獲得概率可以自己指定)
  • 參數:
    • arr:要從中隨機元素的數組
    • weightArr:指定比重的數組(該數組元素個數應該與arr中的元素個數相同,而且每個元素都是int類型)
  • 示例:
let arr=['第一個數','第二個數','第三個數','第四個數'];
let weightArr=[1,2,3,4];
//loop是該庫中的一個方法用於統一管理循環的方法(上面有講解)
loop(10,()=>{
  let random=getRandomFromArrWithWeight(arr,weightArr);
  console.log(random); //這樣'第一個數','第二個數','第三個數','第四個數'輸出的概率就分別是十分之一,十分之二,十分之三,十分之四
});

getRandomStr(num=4,type='all',ifEq=true)

  • 說明:獲取指定個數的隨機字符串
  • 參數:
    • num:生成隨機字符串的個數(默認爲4)
    • type:指定生成隨機字符串的類型.'num':只有數字,'char':只有字母,'lowChar':只有小寫字母,'upChar':只有大寫字母,'all':字母數字都有(默認爲'all')
    • ifEq:如果type爲"all"時,字母出現概率和數字出現概率是否要一致(是概率是否一致,不是數量是否一致),布爾類型(默認爲true,false時字母概率大於數字)
  • 示例:
getRandomStr(16,'all',true)
// 結果 "7a314W55nupLV8P4" (16位的既有數字又有字母的隨機數,且數字和字母出現概率相同)

getRandomPhone()

  • 說明:生成一個11位的隨機的手機號碼

內建對象的工具類部分:

ArrayUtils:對內建對象Array拓展的相關(裏面的方法全部爲baseOnInvadeScale,因爲關聯數組不常用,所以這裏面的所有方法都是針對索引數組的)

contains(value,allEqual=true)

  • 說明:查看元素是否在數組中的方法
  • 參數:
    • value:要檢查是否存在的元素
    • allEqual:是否全等判斷.true時爲必須全等===,false爲==.(默認爲true)
  • 返回值:返回布爾值,表示是否存在指定元素

deleteValue(value,allEqual=true,deleteAll=true)

  • 說明:從數組中刪除指定元素的方法
  • 參數:
    • value:要刪除的元素
    • allEqual:是否要全等的元素才刪除.true時爲必須全等===,false爲==.(默認爲true)
    • deleteAll:是否要刪除指定的全部元素.true時爲全部刪除,false時爲只刪除第一個(默認爲true)
  • 返回值:數組的元素會被刪除,方法返回值也就是這個刪除過元素的數組,所以你可以對它進行鏈式操作
  • 示例:
let arr=[1,2,3,4,5,2,3,6,1,3,2];
arr.deleteValue(3); //結果 [1, 2, 4, 5, 2, 6, 1, 2] ,將多有3的元素都刪除了
arr.deleteValue(2,true,false) //結果 [1, 4, 5, 2, 6, 1, 2] ,只刪除了第一個2的元素
arr.deleteValue(2).push(100); //可以對其進行鏈式操作

spliceOne(index)

  • 說明:splice指定索引的一個元素,並返回這個元素(而不是數組,因爲splice返回的是一個數組,就算只有一個元素)

sum()

  • 說明:求出數組中所有元素和的方法(數組中的元素必須全部是數字或字符串類型的數字,否則返回NaN)
  • 示例:
let arr=[1,2,3,4,5,2,3,6,1,3,2,'12','6',1.1,'6.8']
arr.sum() //結果爲57.9

移動數組元素的幾個方法:

unshiftFromIndex(index)

  • 說明:把數組中指定位置的元素移動到最前面去
  • 特殊用法:比如一個列表中的內容根據訪問時間排序,點擊之後就要把它移動到最上面去,就可以用這個方法
  • 返回值:返回的就是處理之後的該數組,所以可以對其進行鏈式操作
  • 示例:
let arr=['現在最新的內容','現在第二新的內容','現在正準備點擊之後變成最新的內容','現在最後的內容'];
arr.unshiftFromIndex(2) 
//結果爲["現在正準備點擊之後變成最新的內容", "現在最新的內容", "現在第二新的內容", "現在最後的內容"]
arr.unshiftFromIndex(2).unshiftFromIndex(3) //可以對其進行鏈式操作

pushFromIndex(index)

  • 說明:把數組中指定位置的元素移動到最後面去
  • 返回值:返回的就是處理之後的該數組,所以可以對其進行鏈式操作
  • 示例:
let arr=[0,1,2,3,4,5];
arr.pushFromIndex(2); //結果爲[0, 1, 3, 4, 5, 2]

moveToIndexFromIndex(fromIndex,toIndex)

  • 說明:把數組中指定位置的元素移動到指定位置去
  • 參數:
    • fromIndex:要移動的索引
    • toIndex:移動到哪個位置的索引
    • 返回值:返回的就是處理之後的該數組,所以可以對其進行鏈式操作
  • 特殊用法:比如用戶手指滑動列表項,改變列表項順序
  • 示例:
let arr=[0,1,2,3,4,5];
arr.moveToIndexFromIndex(1,3) //結果爲[0, 2, 3, 1, 4, 5]

deepCopy()

  • 說明:把當前數組深拷貝一份並返回(就是上面CommonUtils中的getNewObj方法)
  • 示例:
let arr=[0,1,2,3,4,5];
let arr1=arr.deepCopy(); //arr1與arr內容完全相同
arr1===arr //返回false,不是同一個對象

eachToFloat(args)

  • 說明:將數組內的所有數字或數字字符串轉換爲指定小數位數的數字或數字字符串(其中的每個元素調用MathUtils中的dealWithFloatStr方法,詳情可以去查看該方法)
  • 參數:
    • args 因爲參數比較多,所以以對象的方式傳入可選參數
      • ifChangeArr 表示是否直接改變原數組,爲true時直接改變調用方法的數組,此時返回值沒有意義所以是個空數組;false時不改變原數組,而是返回一個新數組,要在外面用變量接收(默認爲ture,改變)
      • ifRecursion 表示是否遞歸(是否將數組中的數組/對象也進行該方法的調用)(默認爲true)
      • toFixed 保留小數點後幾位(與dealWithFloatStr方法中一樣)(默認爲2)
      • type 四捨五入,還是向上/向下取整(與dealWithFloatStr方法中一樣)(默認爲'round',四捨五入)
      • inputType 要進行處理操作的類型.'both'時數字或數字字符串都會進行處理;'num'時只會處理數字;'str'時只會處理數字字符串.(與dealWithFloatStr方法中一樣)(默認爲'both',都進行處理)
      • outputType 處理後返回的類型.'origin'時保持原類型,輸入是數字返回就是數字,輸入是字符串,返回就是字符串;'num'時不管是數字還是字符串類型的數字都會轉換爲數字;'str'時不管是數字還是字符串類型的數字都會轉換爲字符串類型的數字.(默認爲''origin,保持原類型)
  • 示例:
//下面的結果都是JSON.stringify()後的輸出
let arr=[10,123,'123',[832.123,'1234.123','dsadf12'],{a:10.123,b:'123.86',c:'123dsa'}];
let finalArr=arr.eachToFloat({ifChangeArr:false}); 
//上面arr結果沒變,finalArr結果爲"[10,123,"123.00",[832.12,"1234.12","dsadf12"],{"a":10.12,"b":"123.86","c":"123dsa"}]"
finalArr=arr.eachToFloat({ifChangeArr:false,ifRecursion:false}); 
//上面finalArr的結果爲"[10,123,"123.00",[832.123,"1234.123","dsadf12"],{"a":10.123,"b":"123.86","c":"123dsa"}]"其中的對象和數組就沒有參與處理
finalArr=arr.eachToFloat({ifChangeArr:false,toFixed:1,type:'up',outputType:'str');
//上面finalArr的結果爲"["10.0","123.0","123.0",["832.2","1234.2","dsadf12"],{"a":"10.2","b":"123.9","c":"123dsa"}]"
arr.eachToFloat({toFixed:3,type:'sub',inputType:'str'});
//上面這樣就會直接改變數組中相應的值,這樣就不用外界用變量接收了.arr的結果爲"[10,123,"123.000",[832.123,"1234.123","dsadf12"],{"a":10.123,"b":"123.860","c":"123dsa"}]"

DateUtils:對內建對象Date拓展的相關(裏面方法有普通方法,也有both類型,具體類型,看下面各個方法的方法介紹中)

getDateObj(date)

  • 說明:根據傳進來的日期(可以是Date對象,也可以是字符串類型的日期,也可以是時間戳的Int)將其轉換爲日期對象.(爲了方便使用該方法分別在NumberUtils和StringUtils中加入到了Number和String的原型鏈中,名稱爲toDate)
  • 方法類型:普通方法
  • 參數:
    • date 日期值,可以是Date對象,也可以是字符串,也可以是時間戳的Int.(字符串支持的形式:'2018-08-07 15:51:59','15:51:59 2018-08-07','15:51:59 08/07/2018','08/07/2018'等等,反正只要不是太奇葩的都可以轉成功)
  • 示例:
getDateObj('2012-12-12 00:00:00'); //結果成功生成對象Wed Dec 12 2012 00:00:00 GMT+0800 (CST)
getDateObj(1455241600000); //可以是時間戳的Int

formatDate(date,formatStr='yyyy-MM-dd hh:mm:ss')

  • 說明:將日期對象格式化爲指定格式的字符串形式
  • 方法類型:both(特別說明:原型鏈上的方法名爲了簡介,方法名爲format)
  • 參數:
    • date 要格式化的日期(可以是Date對象,也可以是字符串類型的日期,也可以是時間戳的Int)
    • formatStr 要格式化爲什麼形式的字符串.M表示月,d表示日,h表示小時,m表示分鐘,s表示秒,q表示季度,S表示毫秒(比如默認爲"yyyy-MM-dd hh:mm:ss")
  • 示例:
formatDate('2012-12-12') //結果爲"2012-12-12 00:00:00"
formatDate('2012-12-12 12:12:12','yyyy/MM/dd hh:mm') //結果爲"2012/12/12 12:12"
formatDate(1455241600000,'yyyy/MM/dd hh:mm') //可以是Int類型的時間戳,結果爲"2016/02/12 09:46"
let date=new Date();
formatDate(date,'yyyy/MM/dd hh:mm') //可以是日期對象
date.format('yyyy/MM/dd hh:mm') //因爲是both類型的方法,所以可以通過這種形式來調用

addOrSubDate(date,num,dayOrMouth='day',addOrSub='add',ifChangeDate=true,isBehindZero=false)

  • 說明:在當前日期上加減(幾天,幾月,幾年),並且返回處理後的日期對象
  • 方法類型:both
  • 參數:
    • date 在哪個日期的基礎上增減,可接收日期對象或字符串類型的日期或Int類型的時間戳(傳入的是日期對象時).
    • num 要加上或減去(年月日)的數量
    • dayOrMouth 要加減的是(日 月 還是年...), 'year','month','day','hour','min','second'(默認爲'day',天爲單位)
    • addOrSub 加還是減.(默認是'add',加)
    • ifChangeDate 傳入的date爲日期對象時,是否要改變原始的date對象值(即變成加/減後的日期對象)(默認爲true,改變)
    • isBehindZero 當設置爲true時,比如加一天後的時間爲第二天的0點0分0秒,加一月時爲第二月的第一天的0點0分0秒;減一天後的時間爲當天的0點0分0秒,減一月後爲當月的第一天的0點0分0秒.(默認爲false)
  • 示例:
let dateStr='2012-12-12 12:12:12';
addOrSubDate(dateStr,1); //結果爲Thu Dec 13 2012 12:12:12 GMT+0800 (CST)
addOrSubDate(dateStr,1,'month','sub'); //結果爲Mon Nov 12 2012 12:12:12 GMT+0800 (CST)
let timestamp=1455241600000;
addOrSubDate(timestamp,2,'hour','sub') //也可以是Int類型的時間戳,結果爲Fri Feb 12 2016 07:46:40 GMT+0800 (CST)
let date=new Date();
addOrSubDate(date,2,'hour','sub') //也可以是date對象,結果中改變了原來的date對象
addOrSubDate(date,2,'day','sub',false,true) //這樣就不改變原來的日期對象了.結果爲Sat Oct 20 2018 00:00:00 GMT+0800 (CST)
date.addOrSubDate(2,'day','sub',false,true) //因爲是both類型的方法,所以可以通過這種形式來調用

addOrSubDateFormat(num,formatStr='yyyy-MM-dd',date='',dayOrMouth='day',addOrSub='add',isBehindZero=false)

  • 說明:在當前日期上加減(幾天,幾月,幾年),並且返回格式化後的字符串日期形式(使用方法和上面的方法一樣,只是多了第二個參數formatStr用於指定返回日期字符串的格式化形式)
  • 方法類型:both
  • 示例:
addOrSubDateFormat('2012-12-12 12:12:12',1); //結果爲"2012-12-13"
let date=new Date();
date.addOrSubDateFormat(3); ////因爲是both類型的方法,所以可以通過這種形式來調用

getDateDiff(startTime, endTime, diffType='day',ifAbs=true)

  • 說明:計算兩個日期之間的時間差(計算結果是向上取整的,返回都是整數,比如diffType時間差單位'day'天時,如果兩個時間相減後不足1天,返回就是1)
  • 方法類型:both(特別說明:原型鏈上的方法名爲了簡介,方法名爲diff)
  • 參數:
    • startTime 開始日期時間(可以是Date對象,也可以是字符串類型的日期,也可以是時間戳的Int)
    • endTime 結束日期時間(可以是Date對象,也可以是字符串類型的日期,也可以是時間戳的Int)
    • diffType 最後獲得的時間差的單位.'year':年,'month':月,'day':日,'hour':時,'minute':分,'second':秒.(默認爲'day',天)
    • ifAbs 對最終的時間差是否取絕對值(默認爲true,取絕對值)
  • 示例:
let startTimeStr='2017-11-11 11:11:11';
let endTimeStr='2017-11-12 10:10:10';
getDateDiff(startTimeStr,endTimeStr); //結果爲1
getDateDiff(startTimeStr,endTimeStr,'hour'); //結果爲23
let date=new Date();
date.diff(endTimeStr,'month',false); //因爲是both方法,所以也可以以這種方式調用.結果爲-11

NumberUtils:對內建對象Number拓展的相關方法(裏面的方法全部爲onlyProto)

add()

sub()

mul()

div()

  • 說明: 將MathUtils方法中的精確算術運算的這幾個方法(accDiv,accMul,accAdd,accSub)加入到Number的原型鏈中(具體用法,看MathUtils中的方法介紹)
  • 調用方式(具體用法,看MathUtils中的方法介紹):
let num=5.67;
num.div(7) 

toFixedLenStr(len=2,char='0')

  • 說明:將CommonUtils中的numToFixedLenStr方法加入到Number的原型鏈中
  • 參數:
    • len:到達多少長度
    • char:填充的字符
  • 調用方式(具體用法,看CommonUtils中的方法介紹):
let num=18;
num.toFixedLenStr(4,'*') //結果爲"**18"

toFloatStr(toFixed=2,type='round')

  • 說明:將一個數字類型的值進行處理(保留小數後幾位,捨去部分是四捨五入,還是向上/向下取整)(返回字符串形式時)(其中調用了MathUtils的dealWithFloatStr方法,參數的具體含義與之相同)
  • 參數:
    • toFixed 保留到小數點後幾位,默認爲2
    • type 是四捨五入,還是向上/向下取整
  • 調用方式(具體用法,看MathUtils中的方法介紹):
let num=18.12345;
num.toFloatStr() //結果爲"18.12"
num.toFloatStr(3,'up') //結果爲"18.124"

toFloat(toFixed=null,type='round')

  • 說明:和上面的方法一樣,只是返回值爲數字類型,而非字符串
  • 調用方式(具體用法,看MathUtils中的方法介紹):
let num=18.12345;
num.toFloat(3,'up') //結果爲18.124 

toDate()

  • 說明:將DateUtils中的getDateObj方法加入Number的原型鏈中,將Int類型的時間戳轉換爲日期對象(具體介紹看原方法)
  • 示例:
let num=1455241600000;
num.toDate() //結果轉化爲日期對象 Fri Feb 12 2016 09:46:40 GMT+0800 (CST)

ObjectUtils:對內建對象Object拓展的相關方法(本來在Object的原型鏈上加方法會使調用很簡便,但是這樣的做法被rn拒絕了,所以這裏面的方法都是normal:普通方法)

objEachToFloat(obj,args={})

  • 說明:將數組內的所有數字或數字字符串轉換爲指定小數位數的數字或數字字符串(其中的每個元素調用MathUtils中的dealWithFloatStr方法,詳情可以去查看該方法)(和ArrayUtils中的eachToFloat方法基本一致,這裏就不做過多的示例了)
  • 參數:
    • obj 要進行處理的obj對象
    • args 因爲參數比較多,所以以對象的方式傳入可選參數
      • ifRecursion 表示是否遞歸(是否將數組中的數組/對象也進行該方法的調用)(默認爲true)
      • toFixed 保留小數點後幾位(與dealWithFloatStr方法中一樣)(默認爲2)
      • type 四捨五入,還是向上/向下取整(與dealWithFloatStr方法中一樣)(默認爲'round',四捨五入)
      • inputType 要進行處理操作的類型.'both'時數字或數字字符串都會進行處理;'num'時只會處理數字;'str'時只會處理數字字符串.(與dealWithFloatStr方法中一樣)(默認爲'both',都進行處理)
      • outputType 處理後返回的類型.'origin'時保持原類型,輸入是數字返回就是數字,輸入是字符串,返回就是字符串;'num'時不管是數字還是字符串類型的數字都會轉換爲數字;'str'時不管是數字還是字符串類型的數字都會轉換爲字符串類型的數字.(默認爲''origin,保持原類型)
  • 示例:
//下面的結果是JSON.stringify()後的輸出
let obj={a:10.12341,b:{a:'10.12412',b:true,c:[10,23.0123,'dsad']},c:'40.1'};
objEachToFloat(obj,{toFixed:3,type:'up'}) //結果爲"{"a":10.124,"b":{"a":"10.125","b":true,"c":[10,23.013,"dsad"]},"c":"40.100"}"

getSubObj(obj, subObjDatas,empty=null)

  • 說明:用於獲得obj對象中子對象中的子對象...的值.但是有的時候我們不知道對應的位置是否存在數據(比如obj下面可能不存在class對象)這時直接(obj.class.people.name)這樣取的話就會報錯,這個方法會順着obj對象的子對象一層一層向下找,只要沒有對應的對象就返回null
  • 方法應用場景:要去一個對象指定子對象,子對象的子對象...的值的時候,但是它有可能不存在,還有可能這個對象的父對象就不存在,這時用正常方式取值會報錯,這時就要用到這個方法.
  • 參數:
    • obj 最外層的obj對象
    • subObjDatas 要取的是哪個子對象,可以是字符串或數組(看下面的兩種調用方式)
    • empty 子對象不存在時返回什麼,默認爲null
  • 兩種調用方式:比如要獲得obj.class.people.name的值:
    • 方式1: getSubObj(obj,'class.people.name') 這種方式通常用在子對象鍵名確定,固定,不變的情況
    • 方式2: getSubObj(obj,['class','people','name']). 或者let a='class',b='people',c='name';getSubObj(obj,[a,b,c]); 這種方法通常在子對象鍵名根據變量改變時的情況,使用後面這種形式調用
  • 示例:
let obj={class:{otherProple:{name:'zhangsan'}}};
obj.class.people.name //這樣直接調用就會報錯
getSubObj(obj,'class.people.name') //用該方法就返回null(也可以自定義不存在時的返回值)
let a='class',b='people',c='name'; //模擬鍵名會根據情況改變時
getSubObj(obj,[a,b,c]); //也可以用這種方式調用

gqlObjToString(obj,ifNull=false,num=0)

  • 說明:將對象/數組類型的數據轉換爲字符串(左邊鍵部分不加引號,右邊正常的形式)(要傳入的字符串不加引號時,則在傳入的字符串形參兩邊加上,例如'CONST*')
  • 方法作用:該方法是將對象和數組轉換爲字符串的形式,與JSON.stringify不同的是,不會將對象的鍵(key)的部分也加上雙引號,每個數組元素/對象元素之間不加逗號,值Value爲null或undefined時不會被加入其中,也可以配置爲false,0,''時都不放入.可以讓字符串不加引號.
  • 特殊用法:將對象轉換爲GraphQL的查詢語句(其實該方法就是用於這個功能時寫的,不知道GraphQL的同學請忽略)
  • 參數:
    • obj 傳入的對象或數組
    • ifNull true時只有鍵的值爲undefined或者null時這組鍵值纔不被放入字符串中;false時,0,''等都不放入
    • num 用於記錄遞歸調用的第幾層,也可以在調用時手動給出指定的值作爲最後的縮進
  • 示例:
let obj={a:10.12341,b:{a:'10.12412',b:true,c:[10,23.0123,'dsad']},c:'40.1',d:null,e:undefined,f:'*CONST*'};
gqlObjToString(obj);
//結果爲
/*
"{
    a:10.12341
    b:{
        a:"10.12412"
        b:true
        c:[
            10
            23.0123
            "dsad"
        ]
    }
    c:"40.1"
    f:CONST
}"
*/

subObjDataToObj(obj,dealWithSameSubKey='both',separator='_',allNameKeyArr=null,supKeyArr=[],sameKeyArr=null)

  • 說明:遞歸遍歷對象中的每一個鍵值(k:v)數據,把子對象(值value爲對象)中的鍵值數據都放到最外層父對象(傳入的這個obj對象)中.如果傳入的是一個數組,則遍歷該數組,對其中的每一個對象元素進行該操作.
  • 方法作用:該方法主要用於對象嵌套比較複雜,希望把鍵值都抽取出來到最外層的情況
  • 高能預警:此方法有點複雜,不知道我能不能把它講清楚
  • 參數:
    • obj 要處理的對象(下面說到的父對象就是傳入的這個obj)
    • dealWithSameSubKey 如果遇到子對象中有鍵(key)與父對象中的鍵重複時的操作.
      • "sub":爲以子對象爲主(子對象數據覆蓋父對象的),
      • "sup":爲以父對象爲主(子對象數據直接忽略,跳過),
      • "both":爲都保留.
        • 比如子對象"test"下的key:"name"命名爲"test_name"(多個子對象下有相同key,或父對象中有該key時會這樣命名);
        • 在如有子對象中該鍵名唯一則直接命名爲該鍵名. 比如let obj={bcd:2,cde:{test:'234'}};subObjDataToObj(obj) 這時結果爲{bcd: 2, test: "234"}. 此時要在想讓鍵名爲"cde_test"這樣的形式時,可在allNameKeyArr中加入該鍵名.
    • separator 第二個參數dealWithSameSubKey值爲"both"時子對象名與key之間的分隔符,默認爲"_"
    • allNameKeyArr 除重複鍵名外,需要顯示鍵名全路徑的鍵名.
      • 不傳值時,如果一個子對象中有這個鍵,而且這個鍵名唯一,這個鍵名會被直接用在父對象上. 比如let obj={bcd:2,cde:{test:'234'}};subObjDataToObj(obj) 這時結果爲{bcd: 2, test: "234"}
      • 手動傳入值時,子對象中與sameKeyArr數組中鍵相同的鍵名不管父對象中有沒有該鍵名. 比如let obj={bcd:2,cde:{test:'234'}};subObjDataToObj(obj,'both','_',[],['test']) 這時結果爲{bcd: 2, cde_test: "234"} (這通常用在有兩個或多個子對象中有相同的鍵名,但是父對象中沒有,而且這些子對象中的這些鍵名還可能只存在其中一個的情況)
    • supKeyArr 用於遞歸調用時記錄向上每層父對象的key的數組(調用時不要手動傳入) 這樣的話obj.a.b.c就會轉換爲obj_a_b_c,如果手動傳入null/false則返回b_c
    • sameKeyArr 用於遞歸調用時傳遞相同重複鍵名的數組(調用時不用手動傳,也可手動傳入).給了這個值之後allNameKeyArr值就無效了.
  • 示例:
let obj1={a:{test:123},b:{c:{test:456}},d:{c:{test:789}},e:{f:{test:135}}};
subObjDataToObj(obj1) //結果爲 {a_test: 123, b_c_test: 456, d_c_test: 789, e_f_test: 135}

StringUtils:對內建對象String拓展的相關方法(裏面方法有baseOnInvadeScale類型,也有onlyProto類型,也有both類型,具體類型,看下面各個方法的方法介紹中)

注意字符串是不能改變的,所以下面的方法如果是和改變字符串相關的都是生成的另一個新的字符串,要用另一個變量來接,元字符串不會發生改變

add()

sub()

mul()

div()

  • 說明:將MathUtils方法中的精確算術運算的這幾個方法(accDiv,accMul,accAdd,accSub)加入到Number的原型鏈中
  • 方法類型:這幾個方法都是onlyProto類型
  • 調用方式(具體用法,看MathUtils中的方法介紹):
'5.67'.div(7)

toFixedLenStr(len=2,char='0')

  • 說明:將CommonUtils中的numToFixedLenStr方法加入到String的原型鏈中
  • 參數:
    • len:到達多少長度
    • char:填充的字符
  • 調用方式(具體用法,看CommonUtils中的方法介紹):
let numStr='18';
numStr.toFixedLenStr(4,'*') //結果爲"**18"

isNumeric()

  • 說明:將CommonUtils中的isNumeric方法加入到String的原型鏈中,判斷當前這個字符串是不是數字(調用方法:'123.123dsa'.isNumeric(),具體用法,看CommonUtils中的方法介紹)
  • 方法類型:onlyProto

toFloatStr(toFixed=2,type='round')

  • 說明:將一個字符串類型的數字進行處理(保留小數後幾位,捨去部分是四捨五入,還是向上/向下取整)(返回字符串形式時)(其中調用了MathUtils的dealWithFloatStr方法,參數的具體含義與之相同)
  • 方法類型:onlyProto
  • 參數:
    • toFixed 保留到小數點後幾位,默認爲2
    • type 是四捨五入,還是向上/向下取整
  • 示例:
"18.12345".toFloatStr() //結果爲"18.12"
"18.12345".toFloatStr(3,'up') //結果爲"18.124"

toFloat(toFixed=null,type='round')

  • 說明:和上面的方法一樣,只是返回值爲數字類型,而非字符串
  • 方法類型:onlyProto
  • 示例:
"18.12345".toFloat(3,'up') //結果爲18.124 

toDate()

  • 說明:將DateUtils中的getDateObj方法加入String的原型鏈中,將字符串類型的日期轉換爲日期對象(具體介紹看原方法)
  • 方法類型:onlyProto
  • 示例:
'2012-12-12 00:00:00'.toDate() //結果轉化爲日期對象 Wed Dec 12 2012 00:00:00 GMT+0800 (CST)

getSecStr(leftNum=0,rightNum=0,middleNum=0,secChar='*')

  • 說明:密文顯示字符串,比如身份證號123456199507281234處理爲1234************34這樣的形式
  • 方法類型:both
  • 特殊用法:比如從後端獲取到一些用戶的私密信息(手機號,銀行卡號,身份證等)在界面上密文展示時
  • 參數:
    • leftNum 左邊明文顯示的內容的長度
    • rightNum 右邊明文顯示的內容的長度
    • middleNum 中間隱藏內容的長度(默認0時,爲減去leftNum和rightNum後的長度)
    • secChar 設置密文的字符,默認爲'*'
  • 示例:
let str='1383838438';
str.getSecStr(2,3); //結果爲"13****438"
str.getSecStr(2,3,8); //結果爲"13*******438"
getSecStr(str,2,3,8); //結果同上,也可以以普通方法調用

insertSpace(numStr,spacePositions=4,loop=true)

  • 說明:對傳入的字符串進行4位(spacePositions)隔一空格處理,比如,輸入'432896549984326896532',則輸出'4328 9654 9984 3268 9653 2'
  • 方法類型:both
  • 參數:
    • numStr 傳入要處理的字符串
    • spacePositions 每隔多少位空一格空格(默認爲4).spacePositions爲數組時.比如[4,6,5],字符串爲'432896549984326896532',則輸出'4328 965499 84326 8965 32'
    • loop 表示是否循環,默認爲true.false時,則輸出'4328 965499 84326 896532',只執行一遍
  • 特殊用法:比如用戶在輸入銀行卡號,身份證號時調用此方法讓格式更清晰
  • 示例:
//下面的信息都是亂寫的
let bankCard='6212262201023557228';
bankCard.insertSpace(); //結果爲"6212 2622 0102 3557 228",這是用於銀行卡號的情況.
let IDNum='123456199507281234';
IDNum.insertSpace([6,8,4]); //結果爲"123456 19950728 1234",這是用於身份證時的情況.
let phone='13383838438'; //結果爲"133 8383 8438",這是用於手機號時的情況.
let random='213649213892749217392147236294';
random.insertSpace([2,4,3]) //結果爲"21 3649 213 89 2749 217 39 2147 236 29 4",默認會循環
random.insertSpace([2,4,3],false); //結果爲"21 3649 213 892749217392147236294",不循環時
insertSpace(random,[2,4,3],false) //因爲是both類型的方法,所以也可以通過普通方法的形式調用

indexdWithNum(char,n)

  • 說明:查找字符串中指定字符/字符串第n次出現的位置(找到返回對應位置的索引,沒找到返回-1)
  • 參數:
    • findStr 要查找位置的字符/字符串
    • n 要找第n次出現的位置(默認爲1,第一次出現的位置)
  • 方法類型:baseOnInvadeScale
  • 示例:
let str='root123rootdsahkroot123';
str.indexdWithNum('root'); //結果爲0
str.indexdWithNum('root',3); //結果爲16

insertToIndex(inserts,indexs)

  • 說明:字符串指定位置插入字符/字符串的方法(可以指定多個位置插入多個字符/字符串)
  • 參數:
    • inserts 表示要插入的字符/字符串(給出數組時,在多個位置插入多個字符串)
    • indexs 表示要插入的位置(給數組時在數組指定的多個位置插入)
  • 方法類型:baseOnInvadeScale
  • 示例:
let str='I you';
str.insertToIndex(' love',1); //結果爲"I love you"
str='I you,I you';
str.insertToIndex(' love',[1,7]) //結果爲"I love you,I love you"
str.insertToIndex([' love',' hate'],[1,7]) //結果爲"I love you,I hate you"

getStrCount(strOrReg)

  • 說明:獲取一個字符串中一個指定字符/字符串或正則表達式出現次數
  • 參數:
    • strOrReg 要查找的字符串或正則表達式
  • 方法類型:baseOnInvadeScale
  • 示例:
let str='root123rootdsro132otahkroot123';
str.getStrCount('root'); //結果爲3
str.getStrCount(/ro.*?ot/g) //結果爲4,注意,得加上修飾符g,不然會返回1

trimFunc(char=' ',type='lr')

  • 說明:去除字符串(左右/所有)空格或指定字符
  • 參數:
    • type 要去除的位置.'all':所有,包括字符串中間的,'lr':左右(默認就是這個),'l':左,'r':右
    • char 要去除的字符,默認爲空格' '
  • 方法類型:both
  • 示例:
let str='   I   love  you  ';
str.trimFunc(); //結果爲"I   love  you"
str.trimFunc('all') ;//結果爲"Iloveyou"
str='---I--Love--you---';
str.trimFunc('l','-') //結果爲"I--Love--you---"
trimFunc(str,'l','-') //因爲是both類型,也可以以普通方法的形式調用

toUpperFirst(ifOtherLower = true)

  • 說明:將字符串中的每個單詞首字母大寫
  • 參數:
    • ifOtherLower 如果除了首字母外其他字母有大寫的話是否要轉換爲小寫(默認爲true)
  • 方法類型:baseOnInvadeScale
  • 示例:
let str='I lovE yoU';
str.toUpperFirst(); //結果爲"I Love You"
str.toUpperFirst(false); //結果爲"I LovE YoU"

其他方面的工具類部分:

FileUtils:一些和文件相關的方法(裏面的方法都是normal:普通方法)

formatFileSize(size)

  • 說明:通過傳入的文件字節大小格式化文件大小
  • 參數:
    • size 文件字節大小
  • 示例:
formatFileSize(1236821); //結果爲"1.18MB"
formatFileSize(1236821213); //結果爲"1.15GB"

getBaseName(path)

  • 說明:通過文件路徑返回文件名
getBaseName('somedir/to/test.js') //結果爲"test.js"

getDirName(path)

  • 說明:通過文件路徑返回路勁(上面方法的取反)
getDirName('somedir/to/test.js') //"somedir/to"

getFileType(filePath,haveDot=false)

  • 說明:返回文件的拓展名,haveDot表示是否帶上"點"(.jpg還是jpg)
  • 參數:
    • filePath 文件路勁
    • haveDot 表示是否帶上"點"(比如.jpg還是jpg)(默認爲false)
  • 示例:
getFileType('somedir/to/test.js') //結果爲"js"

pathJoin(dirPath,fileName)

  • 說明:拼接路徑和文件名
  • 參數:
    • dirPath 文件路勁
    • fileName 文件名
  • 示例:
pathJoin('somedir/to','test.js'); //結果爲"somedir/to/test.js"

DebugUtils:一些在開發或調試中要到的方法(裏面的方法都是normal:普通方法)

logFuncName(args)

  • 說明:獲取當前調用方法的方法名,並打印(調用時logFuncName(arguments))(常用於調試,在es6下的部分方法中會報錯)
  • 參數:
    • args:要打印方法名的方法的arguments,要在方法中將arguments當做參數傳進來(因爲rn中沒有arguments.caller)
    • otherStr:另外要打印到一起的字符串
    • char:在方法名的左右用什麼符號來標記,默認爲'-',給出空字符串時不要左右的字符
    • num:左右各多少個char字符,默認35個
  • 示例:
function Test() {
    logFuncName(arguments);
}
打印出***********************************Test***********************************
function Test() {
    logFuncName(arguments,'App','-',20);
}
打印出--------------------App--------------------Test--------------------

getLorem(wordCount=30)

  • 說明:返回一串隨機的亂數假文(就和在webStorm或其他一些支持該功能的IDE中寫lorem後Tab鍵一樣)
  • 參數:wordCount 要生成的假文單詞數目.(默認爲30)
  • 示例:
getLorem() //結果爲"Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nkiuaoxuidbej hdkgnsmf nztqmp ngxsuxmxryubb kkuuegcnj npwtikvax jeitrhdtm, hjmmflmcqf qwhynmxw. Wpt ddoqkvpeaa dymecfpet, mqwhgngubpzbu. Asmthth jlsef fkznuhorv uwexlhzx owpyryoxxww eugqf cdefdkeatlii, ppcfamku. Gqpslqmmyg?"
getLorem(15) //指定單詞數目爲15.結果爲"Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sckyejb hdrko, zqkiuuudb iwuvzwpqll, ycvceyrlgadw yuzwcqjezdsq qnxho,."

getDataFromNetTest(pageLen=20,page=1,ms=3000,max=100)

  • 說明:模擬網絡獲取數據方法,模擬分頁請求網絡數據(react-native-page-listview中的模擬數據就是通過這個方法獲得的)
  • 參數:
    • pageLen 獲得數據的每一頁的數據條數(默認20條)
    • page 獲得數據的頁數(默認第1頁)
    • ms 模擬多少毫秒後可以獲得網絡傳輸的數據(默認3000毫秒:即3秒)
    • max 模擬數據庫中總共有多少條數據(默認最多100條,這時如果每頁20條,第5頁有數據,第6頁就沒有數據了)
  • 示例:
getDataFromNetTest()
    .then((res)=>{console.log(res)}); 
    //這裏結果爲3秒鐘後打印出一個長度20的數組,數組中每條元素就是一個對象,該對象裏面
    //{index:當前數據的索引(即對幾條數據),name:一個隨機生成的名字,age:隨機年齡,phone:隨機電話號碼,text:隨機的一串文字(上面的getLorem方法)}.
    //這裏的對象格式現在是固定的,後面可能會將其改爲可以從參數中傳遞來.

終於整理完了

整理了好幾整天終於整理完了,現在方法還比較少,不過還是算都比較常用的.

(↓ˉ▽ˉ↓)

如果大家覺得我的組件好用的話,幫到你的話,歡迎大家Star,Fork,如果有什麼問題的話也可以在github中想我提出,謝謝大家的支持.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章