不知不觉距离第一次发文章介绍自己写的库BootsJS已经过去一个月了,这个月里收到了许许多多JYM的反馈与建议,自己也再一次对BootsJS进行了改进与完善,又一次增加了很多功能,为此我想应该给JYM们汇报汇报这个月的工作进展。
BootJS仓库:https://github.com/JunLiangWangX/BootsJS
BootJS文档:https://junliangwangx.github.io/BootsJS/
上一版本功能
害怕新的同学没看过之前文章,容我花点篇幅介绍下之前版本支持的功能!
库的安装与引用,方法的具体使用大家可以看我之前的文章:《摸鱼时间写了个库,比lodash更丰富!》,我就不在这里赘述了。
日期处理工具:DateTool
方法 | 作用 |
---|---|
dateCalculator | 日期加/减计算 |
dateFormater | 格式化日期与时间 |
getDateDiff | 计算两日期的相隔时间 |
getDaysInMonth | 给定日期返回当月总天数 |
isLeapYear | 给定年份判断是否闰年 |
性能工具:PerformanceTool
方法 | 作用 |
---|---|
debounce | 防抖 |
throttle | 节流 |
memoize | 缓存函数的计算结果 |
字符串处理工具:StringTool
方法 | 作用 |
---|---|
camelCaseNameToDashName | 驼峰命名转短横线命名 |
dashNameToUpperCamelCaseName | 短横线命名转大写驼峰命名 |
正则规则:RegRules
方法 | 作用 |
---|---|
IPAddressRule | 匹配IP地址 |
chineseIDCardRule | 匹配身份证号码 |
chinesePhoneNumberRule | 匹配中国手机号码 |
… | … |
优先级队列:PriorityQueue
方法 | 作用 |
---|---|
priorityQueue.enqueue(‘1’, 1) | 入队 |
priorityQueue.dequeue() | 出队 |
priorityQueue.top | 获取队顶元素 |
priorityQueue.length | 获取队列大小 |
priorityQueue.isEmpty | 队列是否为空 |
本版本新增的功能
我们来看看这个月加入了什么引人注目的功能吧!
对象处理工具:ObjectTool
// -------- Global Import(全局引入)
const BootsJS = require('boots-js'); // Node
import BootsJS from 'boots-js' // Es6 Module
BootsJS.ObjectTool.type(123); //'Number'
// -------- Import on Demand(按需引入)
const { ObjectTool } = require('boots-js/object-tool'); // Node
import { ObjectTool } from 'boots-js/object-tool' // Es6 Module
ObjectTool.type(123); //'Number'
判断参数类型:type()
ObjectTool.type(new Array()); //'Array'
ObjectTool.type('123'); //'String'
ObjectTool.type(true); //'Boolean'
ObjectTool.type(new Map()); //'Map'
深度拷贝对象:deepClone()
// 支持的类型:原始类型、TypedArray、Array、Set、Map、Object、ArrayBuffer、DataView、Date、RegExp、Symbol、Proxy(将被视为对象,拦截器无法复制)
// 注意:不支持的类型,例如:Function、WeakRef、WeakSet、WeakMap等会直接复制其引用
const obj1={Number:1},obj2={Boolean:2},obj3={obj:obj1,String:'123'},
const testObj={
Int8Array:new Int8Array([1,2,3,4,5]),
Date:new Date(),
RegExp:/1234/,
Array:new Array(...[obj1,obj2,obj3]),
Set:new Set([obj1,obj2,obj3]),
Map:map,
Object:obj3,
ArrayBuffer:new ArrayBuffer(10),
DataView:new DataView(new ArrayBuffer(10)),
Function:fun
}
let deepCopyObj=ObjectTool.deepClone(testObj)
deepCopyObj.Int8Array===testObj.Int8Array //false
deepCopyObj.Date===testObj.Date //false
deepCopyObj.Object.obj1.obj===testObj.Object.obj1.obj //false
比较两对象是否相等:isEqual()
// 支持的类型:原始类型、TypedArray、Array、Set、Map、Object、ArrayBuffer、DataView、Date、RegExp、Symbol(比较其description)、Proxy(将被视为对象,拦截器无法比较)
// 注意:不支持的类型,例如:Function、WeakRef、WeakSet、WeakMap等会直接比较其引用地址
const testObj2={
BigInt64Array:new BigInt64Array([BigInt(123),BigInt(123),BigInt(123)]),
RegExp:/1234/,
Array:new Array(...[obj1,obj2,obj3,obj4]),
Set:new Set([obj1,obj2,obj3,obj4]),
Object:obj4,
Map:map2,
Date:date,
ArrayBuffer:new ArrayBuffer(10),
DataView:new DataView(new ArrayBuffer(10)),
}
ObjectTool.isEqual(testObj2,ObjectTool.deepClone(testObj2)) //true
let testObj5=ObjectTool.deepClone(testObj2)
testObj5.Object.obj1.String='12344'
ObjectTool.isEqual(testObj2,testObj5) //false
将对象转换为String:argToStrKey()
// 支持的类型:原始类型、TypedArray、Array、Set、Map、Object、ArrayBuffer、Function、DataView、Date、 RegExp、Symbol、Proxy(将被视为对象,拦截器无法输出)
// 注意:不支持的类型,例如:WeakRef、WeakSet、WeakMap等会直接输出类型
const testObj2={
BigInt64Array:new BigInt64Array([BigInt(123),BigInt(123),BigInt(123)]),
RegExp:/1234/,
Array:new Array(...[obj1,obj2,obj3,obj4]),
Set:new Set([obj1,obj2,obj3,obj4]),
Object:obj4,
Map:map2,
Date:date,
ArrayBuffer:new ArrayBuffer(10),
DataView:new DataView(new ArrayBuffer(10)),
}
const testObj3={
Array:new Array(...[obj1,obj2,obj3,obj4]),
Set:new Set([obj1,obj2,obj3,obj4]),
BigInt64Array:new BigInt64Array([BigInt(123),BigInt(123),BigInt(123)]),
ArrayBuffer:new ArrayBuffer(10),
Object:obj4,
Map:map2,
Date:date,
DataView:new DataView(new ArrayBuffer(10)),
RegExp:/1234/,
}
let testObj5=ObjectTool.deepClone(testObj2)
testObj5.Object.obj1.String='12344'
ObjectTool.argToStrKey(testObj2)===ObjectTool.argToStrKey(testObj3) //true
ObjectTool.argToStrKey(testObj2)===ObjectTool.argToStrKey(testObj5) //false
处理树的工具:TreeTool
// -------- Global Import(全局引入)
const BootsJS = require('boots-js'); // Node
import BootsJS from 'boots-js' // Es6 Module
BootsJS.TreeTool.tree2Array(tree,'childList',options)
// -------- Import on Demand(按需引入)
const { TreeTool } = require('boots-js/tree-tool'); // Node
import { TreeTool } from 'boots-js/tree-tool' // Es6 Module
TreeTool.tree2Array(tree,'childList',options)
树转换成数组: tree2Array()
const tree = {
name: '中国',
code: '0',
childList: [
{
name: '重庆',
code: '01',
},
{
name: '四川',
code: '02',
},
{
name: '广东',
code: '03',
},
]
}
let arr = TreeTool.tree2Array([tree], 'childList', {
isGenerateLevel: true,
generateLevelAttributeName:'level',
isGenerateParentID: true,
generateParentIDAttributeName: 'parentCode',
nodeIDAttributeName: 'code',
deleteAttributeList: ['childList']
})
console.info(arr)
[
{ name: '中国', code: '0' , level:0 },
{ name: '重庆', code: '01', level:1 , parentCode: '0' },
{ name: '四川', code: '02', level:1 , parentCode: '0' },
{ name: '广东', code: '03', level:1 , parentCode: '0' },
]
数组转换为树:array2Tree()
const arr = [
{ name: '中国', code: '0' , level:0 },
{ name: '重庆', code: '01', level:1 , parentCode: '0' },
{ name: '四川', code: '02', level:1 , parentCode: '0' },
{ name: '广东', code: '03', level:1 , parentCode: '0' },
]
let genTree = TreeTool.array2Tree(arr, 'code', 'parentCode', 'childList', (node) => {
return !('parentCode' in node)
})
console.info(genTree)
[
{
name: '中国',
code: '0',
level: 0,
childList: [
{ name: '重庆', code: '01', level:1, parentCode: '0', childList: [] },
{ name: '四川', code: '02', level:1, parentCode: '0', childList: [] },
{ name: '广东', code: '03', level:1, parentCode: '0', childList: [] }
]
}
]
获取所有子节点:getChildList()
const tree = {
name: '中国',
code: '0',
childList: [
{
name: '重庆',
code: '01',
},
{
name: '四川',
code: '02',
},
{
name: '广东',
code: '03',
},
]
}
let arr = TreeTool.getChildList([tree], 'code', '0', 'childList')
console.info(arr)
[
{ name: '重庆', code: '01' },
{ name: '四川', code: '02' },
{ name: '广东', code: '03' },
]
过滤节点:filter()
const tree = {
name: '中国',
code: '0',
level: 0,
childList: [
{ name: '重庆', code: '01', level:1, parentCode: '0', childList: [] },
{ name: '四川', code: '02', level:1, parentCode: '0', childList: [] },
{ name: '广东', code: '03', level:1, parentCode: '0', childList: [] }
]
}
let arr = TreeTool.filter([tree], 'childList', (obj) => {
return obj.parentCode === '0'
})
console.info(arr)
[
{ name: '重庆', code: '01', level:1 , parentCode: '0', childList: [] },
{ name: '四川', code: '02', level:1 , parentCode: '0', childList: [] },
{ name: '广东', code: '03', level:1 , parentCode: '0', childList: [] },
]
查找某节点的路径:findPath()
const tree = {
name: '中国',
code: '0',
level: 0,
childList: [
{ name: '重庆', code: '01', level:1, parentCode: '0', childList: [] },
{ name: '四川', code: '02', level:1, parentCode: '0', childList: [] },
{ name: '广东', code: '03', level:1, parentCode: '0', childList: [] }
]
}
let path = TreeTool.findPath([tree],'code','03','childList')
console.info(path)
[
{
name: '中国',
code: '0',
level: 0,
childList: [ [Object], [Object], [Object] ]
},
{ name: '广东', code: '03', parentCode: '0', level: 1, childList: [] }
]
处理数组的工具:ArrayTool
// -------- Global Import(全局引入)
const BootsJS = require('boots-js'); // Node
import BootsJS from 'boots-js' // Es6 Module
BootsJS.ArrayTool.removeDuplicates([1,2,3,1]);
// -------- Import on Demand(按需引入)
const { ArrayTool } = require('boots-js/array-tool'); // Node
import { ArrayTool } from 'boots-js/array-tool' // Es6 Module
ArrayTool.removeDuplicates([1,2,3,1]);
数组去重: removeDuplicates()
const test1={a:'1'},test2={a:'1'},
arr1=[test1,test2,test1],
arr2=[1,2,3,1,4];
ArrayTool.removeDuplicates(arr1) // [{a:'1'},{a:'1'}]
ArrayTool.removeDuplicates(arr1,true) // [{a:'1'}]
ArrayTool.removeDuplicates(arr2) //[1,2,3,4];
处理日期时间的工具:DateTool
// -------- Global Import(全局引入)
const BootsJS = require('boots-js'); // Node
import BootsJS from 'boots-js' // Es6 Module
BootsJS.DateTool.dateFormater(new Date(),'YYYY-MM-DD HH:mm:ss');
// -------- Import on Demand(按需引入)
const { DateTool } = require('boots-js/date-tool'); // Node
import { DateTool } from 'boots-js/date-tool' // Es6 Module
DateTool.dateFormater(new Date(),'YYYY-MM-DD HH:mm:ss');
转换时区: convertTimeZone()
DateTool.convertTimeZone(
1711611931754,
DateTool.timeZoneOffsetEnum['UTC+08:00'],
DateTool.timeZoneOffsetEnum['UTC-06:00'])
DateTool.convertTimeZone(
'2024/2/12',
DateTool.timeZoneOffsetEnum['UTC+08:00'],
DateTool.timeZoneOffsetEnum['UTC+09:00'])
最后
目前我只想到和完成了这些功能,希望大家多多提提意见呀,包括想要的功能,改进建议等等,我一个人的想法和能力都过于局限,如果有余力的话欢迎PR一起弄呀!如果真的对大家有所帮助,能给个star鼓励下作者嘛🫡,如果我也能有个超多star的仓库就好了🙈
BootJS仓库:https://github.com/JunLiangWangX/BootsJS
BootJS文档:https://junliangwangx.github.io/BootsJS/
点击链接或微信搜索“汪啊汪”🔎,关注我及时掌握最新动态
本文由mdnice多平台发布