1. 程式人生 > >react-native-gp-utils(對react-native全局進行配置,對內置對象原型)

react-native-gp-utils(對react-native全局進行配置,對內置對象原型)

catch 形式 使用 新項目 format) 三種 prop 指定元素 zha

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"}. 此時要在想讓鍵名為"cdetest"這樣的形式時,可在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中想我提出,謝謝大家的支持.

react-native-gp-utils(對react-native全局進行配置,對內置對象原型)