# 其他

其他功能函数集合

# createEnum

  • 参数:
    • {Object} definition 枚举数组
    • {String} field 要赋值给常量名的字段名
  • 返回值:{Array}
  • 说明:创建枚举对象
  • 示例:

    TIP

    数组被该方法包装后,会将常量挂到数组对应的常量名上

const meters = createEnum(
  [
    { code: 1, name: '门禁', const: 'MENJIN' },
    { code: 2, name: '停车', const: 'TINGCHE' },
    { code: 3, name: '监控', const: 'JIANKONG' }
  ],
  'code'
)
console.log(meters.MENJIN) // 1
console.log(meters)
/* 输出:
[
  {
    "code": 1,
    "name": "门禁"
  },
  {
    "code": 2,
    "name": "停车"
  },
  {
    "code": 3,
    "name": "监控"
  }
]
*/

# getRandomString

  • 参数:
    • {Number} length 长度
    • {Boolean} isPureNumber 是否仅包含数字
  • 返回值:{String}
  • 说明:获取指定长度的随机字符串
  • 示例:
getRandomString(32) // R_65HwlQk0t69elzcJ8o5a9RxJjWm5vq5A
getRandomString(32, true) // 15679008947220468022363554452145

# getRandomRangeNumber

  • 参数:
    • {Number} min 最小值
    • {Number} max 最大值
  • 返回值:{Number}
  • 说明:获取指定数字范围内的随机数字
  • 示例:
getRandomRangeNumber(100, 10000) // 8343.857252274678

# getRandomColor

  • 参数:
  • 返回值:{String}
  • 说明:生成随机 16 进制的颜色
  • 示例:
getRandomColor() // #27a574

# throttle

  • 参数:
  • {Function} func 执行的函数
  • {Number} delay 节流时间(单位:毫秒)
  • 返回值:
  • 说明:函数节流(执行第一个)

    WARNING

    不允许传入匿名函数,否则无效

  • 示例:
function speak() {
  console.log('hello, world')
}
function mount() {
  throttle(speak, 500)
}
mount() // 输出: hello, world
mount() // 不输出
mount() // 不输出

# debounce

  • 参数:
    • {Function} func 执行的函数
    • {Number} delay 防抖时间(单位:毫秒)
  • 返回值:
  • 说明:函数防抖(执行最后一个)

    WARNING

    不允许传入匿名函数,否则无效

  • 示例:
function speak() {
  console.log('hello, world')
}
function mount() {
  debounce(speak, 500)
}
mount() // 不输出
mount() // 不输出
mount() // 输出: hello, world

# sleep

  • 参数:{Number} duration
  • 返回值:{Promise}
  • 说明:程序睡眠一定时间后继续执行,此函数为异步函数
  • 示例:
console.log('start')
await sleep(3) // 睡眠 3 秒
console.log('end')

# decodeValue

  • 参数:{String} value
  • 返回值:{String}
  • 说明:解码被编码的字符串
  • 示例:
decodeValue('我') // 我
decodeValue('%E6%88%91') // 我
decodeValue('%u6211') // 我

# copyToClipboard

  • 参数:
    • {String} value
  • 返回值:{Promise}
  • 说明:复制指定的内容到剪贴板
  • 示例:
copyToClipboard('我爱我的祖国').then(() => {
  alert('复制成功')
})

# nest2Flat

  • 参数:
    • {Object} data 嵌套对象数据
    • {Object} keys 配置键名
    • {String} pathProp 用于描述路径的属性(该属性必须存在于对象上)
      // 默认 keys:
      {
        id: 'id', // 数据 id
        pid: 'parentId', // 数据父 id
        children: 'children' // 子节点名
      }
    
  • 返回值:{Array}
  • 说明:将嵌套结构数据转成父子关系的数组
  • 示例:
const data = {
  id: 1,
  children: [
    {
      id: 2,
      children: [{ id: 3 }, { id: 4 }]
    }
  ]
}
nest2Flat(data)[
  // 返回:
  ({ id: 3, parentId: 2 }, { id: 4, parentId: 2 }, { id: 2, parentId: 1 }, { id: 1 })
]

# flat2Nest

  • 参数:
    • {Array<Object>} data 父子关系数组
    • {Object} keys 配置键名
    // 默认 keys:
    {
      id: 'id', // 数据 id
      pid: 'parentId', // 数据父 id
      children: 'children' // 子节点名
    }
    
  • 返回值:{Object}
  • 说明:将含有父子 ID 关系的数组转成嵌套结构
  • 示例:
const data = [{ id: 3, parentId: 2 }, { id: 4, parentId: 2 }, { id: 2, parentId: 1 }, { id: 1 }]
flat2Nest(data)[
  // 返回:
  {
    id: 1,
    children: [
      {
        id: 2,
        parentId: 1,
        children: [
          {
            id: 3,
            parentId: 2,
            _signature: 'R_w8ChcE03AFh7FqX4V8uLz0YXCuaA25U5',
            _isLeaf: true
          },
          {
            id: 4,
            parentId: 2,
            _signature: 'R_lZ1RFwuKe7mW4HgXeIiyaGuCxE13TH7A',
            _isLeaf: true
          }
        ],
        _signature: 'R_vDtv1T4ihY10AiXw2Xo3XIN5iQilg705',
        _isLeaf: false
      }
    ],
    _signature: 'R_NNx0qaEuR4jI9tAqKRvgi209cXE15d3c',
    _isLeaf: false
  }
]

# getCodeMapName

  • 参数:
    • {String | Number} code 枚举值
    • {Array<Object>} codeMap 枚举数组
    • {Object} keys 枚举对应的键
// 默认键名:
{
name: 'name',
code: 'code'
}
  • 返回值:{String}
  • 说明:获取枚举数组中的 code 对应的 name
  • 示例:
getCodeMapName(1, [
  { code: 1, name: '苹果' },
  { code: 2, name: '梨子' }
]) // 苹果

# deepClone

  • 参数:{Object | Array} value
  • 返回值:{Object | Array}
  • 说明:深度克隆对象
  • 示例:
const a = { name: 'alex' }
const b = deepClone(a)
console.log(b) // 输出 { name: 'alex' }
a === b // false

# cleanPureArray

  • 参数:{Array<String | Number | Boolean | Null | Undefined>} arr
  • 返回值:{Array}
  • 说明:基本数据类型的数组去重
  • 示例:
cleanPureArray([1, 2, 3, 3, 4, 1, true, true, null, null, undefined, undefined])
// [1, 2, 3, 4, true, null, undefined]

# cleanObjectArray

  • 参数:
    • {Array<Object>} arr
    • {String} key 依赖的键名
  • 返回值:{Array<Object>}
  • 说明:对象类型的数组去重
  • 示例:
const arr = [
  { name: 'alex', age: 18 },
  { name: 'alex', age: 25 },
  { name: 'jack', age: 25 }
]
cleanObjectArray(arr, 'name') // [{ name: 'alex', age: 18 }, { name: 'jack', age: 25 }]
cleanObjectArray(arr, 'age') // [{ name: 'alex', age: 18 }, { name: 'alex', age: 25 }]

# flatDeepArray

  • 参数:{Array<Any>} arr 多维数组
  • 返回值:{Array<Any>}
  • 说明:将深层多维数组转成一维数组,等价于 Array.prototype.flat
  • 示例:
flatDeepArray([1, 2, [1, 3, 4, [5, 8], [0, 10, [{ a: 10, b: null }]]]]) // [1, 2, 1, 3, 4, 5, 8, 0, 10, { a: 10, b: null }]

# filterXSSCharacters

  • 参数:{String} value
  • 返回值:{String}
  • 说明:过滤 XSS 危险的脚本字符
  • 示例:
const str = '<script>alert(3)</script>'
filterXSSCharacters(str) // lt;scriptgt;alert(3)lt;scriptgt;

# filterRichtextTags

  • 参数:{String} value
  • 返回值:{String}
  • 说明:过滤富文本字符串中的标签
  • 示例:
const str = '<script>alert(3)</script>'
filterRichtextTags(str) // alert(3)

# openWindow

  • 参数:
    • {String} url 地址
    • {String} title 标题
    • {Number} width 宽度
    • {Number} height 高度
  • 返回值:
  • 说明:打开无工具栏的新窗口
  • 示例:
openWindow('http://www.baidu.com/', '百度', 400, 200)

# watchChange

  • 参数:
    • {Object} obj 监听的对象
    • {Function} callback 回调函数
      • {String} prop 变动的属性名
      • {String} action get 或 set
      • {Any} newValue 新值
      • {Any} oldValue 旧值
  • 返回值:
  • 说明:监控对象的变化
  • 示例:
const obj = {
  a: 10,
  b: 20
}
watchChange(obj, () => {
  console.log('obj 发生变化了')
})
obj.a = 1000

# tryCatch

  • 参数:{Promise} promise Promise 对象
  • 返回值:{Array} [err, res]
  • 说明:对 async 函数的调用进行包装,简化 try catch 处理异常
  • 示例:
async function getNodes() {
  //....
}

// 不使用 tryCatch 函数
try {
  await getNodes()
} catch (e) {
  console.log(e)
}

// 使用 tryCatch 函数
const [err, res] = await tryCatch(getNodes())
if (err) {
  console.log(err)
}

# asyncLoadLib

  • 参数:
    • {Array|String} urls 要加载的库的路径
    • {String} sign 加载的唯一标识
  • 返回值:
  • 说明:异步加载需要的库
  • 示例:
asyncLoadLib(
  [
    'https://cdn.jsdelivr.net/npm/tinymce-all-in-one@4.9.3/tinymce.min.js',
    'https://cdn.jsdelivr.net/npm/tinymce-all-in-one@4.9.3/tinymce.min.css'
  ],
  'tinymce'
).then(() => {
  console.log('加载成功')
})

# deepTrim

  • 参数:{Any} obj 要 trim 的对象
  • 返回值:{Any} trim 后的对象
  • 说明:深度移除字符串空格
  • 示例:
deepTrim({ name: 'a ge', { age: ' name ' }}) // 输出: { name: 'age', { age: 'name' }}

# compareVersion

  • 参数:
    • {String} v1 版本号 1
    • {String} v2 版本号 2
  • 返回值:{Number}
    • -1 表示 v1 小于 v2
    • 1 表示 v1 大于 v2
    • 0 表示 v1 与 v2 相等
  • 说明:比较两个版本号的大小,支持比较不同风格的版本号
  • 示例:
compareVersion('2.3.5', '4.78.1') // 输出: -1
compareVersion('7.0.1', '7.0.0') // 输出: 1
compareVersion('7.0.0', '7.0') // 输出: 0
compareVersion('9.7.18', '10.2') // 输出: -1

# upperCaseFirst

  • 参数:{String} input 字符串
  • 返回值:{String} 首字母大写后的字符串
  • 说明:获取首字母大写字符串
  • 示例:
upperCaseFirst('abc') // 输出: Abc