156 lines
4.9 KiB
JavaScript
156 lines
4.9 KiB
JavaScript
/**
|
|
* @Description: 扩展基类原型方法
|
|
* @ComponentName: System.tools
|
|
* @Author: wangzhigang11
|
|
* @Date: 2022-06-24 19:35
|
|
*/
|
|
/**
|
|
* 扩展基类原型方法,已载入全局基类,可直接调用
|
|
* @module common/systemToolExtend
|
|
* @Author: wangzhigang11
|
|
* @Date: 2022-07-19 14:07
|
|
*/
|
|
|
|
import checkTypes from "@/utils/checkTypes";
|
|
const ArrayPrototype = Array.prototype
|
|
const NumberPrototype = Number.prototype
|
|
const StringPrototype = String.prototype
|
|
const FilePrototype = File.prototype
|
|
|
|
/**
|
|
* 根据内容结果获取列表中的内容项
|
|
* @function
|
|
* @param { string } code 编码
|
|
* @param { string } itemKey 列表项中的筛选项 默认为value
|
|
* @example
|
|
* const arr1 = [ { label: 'xxx', value: 1 }, { label: 'yyy', value: 2 } ]
|
|
* arr1.getItemByCode(1) // -> { label: 'xxx', value: 1 }
|
|
* * const arr2 = [ { a: '1', b: 2 }, { a: '3', b: 4 } ]
|
|
* arr2.getItemByCode(1, 'a') // -> { a: '1', b: 2 }
|
|
* @returns {object}
|
|
*/
|
|
ArrayPrototype.getItemByCode = function (code, itemKey = 'value') {
|
|
if (!checkTypes.isArray(this)) return {}
|
|
for (const item of this) {
|
|
if (`${item[itemKey]}` === `${code}`) return item
|
|
}
|
|
return {}
|
|
}
|
|
|
|
/**
|
|
* 根据逗号分割的内容获取结果
|
|
* @param { string[] } code 需要查找的内容
|
|
* @param { string } code 需要查找的内容
|
|
* @param { object } option 查找的配置
|
|
* @param { string } option.label 查找结果字符串的映射字段
|
|
* @param { string } option.key 查找结果的键的映射字段
|
|
* @param { string } option.separator 分割符,默认为','
|
|
* @param { string } option.emptyText 查找结果无效时显示的内容
|
|
* @example
|
|
* const arr = [{id: 1, name: '小红'}, [id: 3, name: '小明']]
|
|
* arr.getLabelByCodes('1,3', { label: 'name', key: 'id' }) // => '小红,小明'
|
|
* arr.getLabelByCodes('1,3', { label: 'name', key: 'id', separator: '/' }) // => '小红/小明'
|
|
* @returns {string}
|
|
*/
|
|
ArrayPrototype.getLabelByCodes = function (code, option = {}) {
|
|
if (!checkTypes.isArray(this)) return ''
|
|
const curCode = checkTypes.isNumber(code) && code === 0 ? '0' : code || ''
|
|
let filterCode = []
|
|
if (checkTypes.isArray(code)) {
|
|
filterCode = code.filter(item => !!item)
|
|
} else {
|
|
filterCode = `${curCode}`.split(',').filter(item => !!item)
|
|
}
|
|
return filterCode.map(itemCode => {
|
|
return this.getItemByCode(itemCode, option.key || 'value')[option.label || 'label'] || ''
|
|
}).filter(item => item !== '').join(option.separator || ',') || option.emptyText || ''
|
|
}
|
|
|
|
ArrayPrototype.getIndexByCode = function (code, itemKey = 'value') {
|
|
return this.findIndex(cur => cur[itemKey] === code)
|
|
}
|
|
|
|
ArrayPrototype.hasCode = function (code, key = 'value') {
|
|
const filter = this.findIndex(item => item[key] === code)
|
|
return filter >= 0
|
|
}
|
|
|
|
/**
|
|
* 数据处理工具,保留小数点后几位,并添加单位
|
|
* @function superFixed
|
|
* @private
|
|
* @param { number} len 保留位数
|
|
* @param { string } unit 单位
|
|
* @example
|
|
* const test = 1
|
|
* test.superFixed(2) // => 1.00
|
|
* test.superFixed(2, '个') // => '1.00个'
|
|
* @returns {string|number}
|
|
*/
|
|
NumberPrototype.superFixed = function (len = 0, unit = '') {
|
|
return (this || 0).toFixed(len) + unit
|
|
}
|
|
|
|
/**
|
|
* 数据处理工具,保留小数点后几位,并添加单位
|
|
* @function superFixed
|
|
* @param { number} len 保留位数
|
|
* @param { string } unit 单位
|
|
* @example
|
|
* const test1 = '1'
|
|
* test1.superFixed(2) // => 1.00
|
|
* test1.superFixed(2) // => 1.00
|
|
* const test2 = 1
|
|
* test2.superFixed(2) // => 1.00
|
|
* test2.superFixed(2, '个') // => '1.00个'
|
|
* @returns {string|number}
|
|
*/
|
|
StringPrototype.superFixed = function (len = 0, unit = '') {
|
|
// 如果是数字型字符串 返回保留后的
|
|
if (/^[-\+]?[\d]*\.?[\d]*$/.test(this)) return Number(this).superFixed(len, unit)
|
|
// 如果是其他字符串,返回本身
|
|
return this
|
|
}
|
|
|
|
function base64ToBlob(base64) {
|
|
const parts = base64.split(';base64,');
|
|
const contentType = parts[0].split(':')[1];
|
|
const raw = window.atob(parts[1]);
|
|
const rawLength = raw.length;
|
|
const uInt8Array = new Uint8Array(rawLength);
|
|
for (let i = 0; i < rawLength; ++i) {
|
|
uInt8Array[i] = raw.charCodeAt(i);
|
|
}
|
|
return new Blob([uInt8Array], {type: contentType});
|
|
}
|
|
|
|
|
|
StringPrototype.toFile = function () {
|
|
// 使用Base64字符串创建一个File对象
|
|
return new File([base64ToBlob(this)], `file_${new Date().valueOf()}`, {
|
|
type: 'image/png',
|
|
})
|
|
}
|
|
|
|
/**
|
|
* 文件转base64
|
|
* @param {boolean} splitHeader 是否需要切掉base64头
|
|
* @example
|
|
* file.toBase64() // => 'image/jpeg;base64,VFZSSmVrMVVTWG8lM0Q='
|
|
* file.toBase64(true) // => 'VFZSSmVrMVVTWG8lM0Q='
|
|
* @returns {string}
|
|
*/
|
|
FilePrototype.toBase64 = function (splitHeader = false) {
|
|
return new Promise((resolve, reject) => {
|
|
const fileReader = new FileReader()
|
|
fileReader.readAsDataURL(this)
|
|
fileReader.onload = (e) => {
|
|
let base64Str = e.target.result
|
|
if (splitHeader) {
|
|
base64Str = base64Str.substr(base64Str.indexOf(',') + 1)
|
|
}
|
|
resolve(base64Str)
|
|
}
|
|
})
|
|
}
|