1. 递归 数组生成树
/**
* 将数组转为树 递归
* @param { Array } list 传入的数组
* @param { Number } pid 父级ID
* @return { Tree } 数据类型
*/
export function listToTree(list, pid = null) {
return list.filter(item => item.pid == pid).map(item => {
let children = listToTree(list, item.id)
if (children.length > 0) {
return { ...item, children }
} else {
return { ...item }
}
})
}
2. 字典表 数组生成树
/**
* 讲数组转为树 字典表
* @param { Array } inputValue
* @return { Tree } 数据类型
*/
export function toTree(inputValue) {
const newArr = []
const map = {}
inputValue.forEach(item => {
item.children = []
const key = item.id
map[key] = item
})
inputValue.forEach(item => {
const parent = map[item.pid]
if (parent) {
parent.children.push(item)
} else {
newArr.push(item)
}
})
return newArr
}
3. 递归删除特定字段
/**
* 递归删除特定字段
* @param { Tree } list
* @return { Tree } 数据类型
*/
export function resetTree(list, childrenName = 'children') {
for (let i = 0; i < list.length; i++) {
const item = list[i]
if (item && item[childrenName]) {
// children为空数组时删除
if (item[childrenName].length === 0) {
delete item[childrenName]
} else {
// 递归当前children数组
resetTree(item[childrenName], childrenName)
}
}
}
return list
}
4.判断数据类型
/**
* 判断数据类型
* @param { * } inputValue
* @return { string } 数据类型
*/
export function judgeDataType(inputValue) {
const typeString = Object.prototype.toString.call(inputValue)
return typeString.slice(8, -1)
}
5.保留两位小数(不四舍五入)
// 保留两位小数
export function retainDecimal(value1) {
return value1.replace(/([0-9]+\.[0-9]{2})[0-9]*/, '$1')
}
6.判断设备类型
// 判断当前设备是H5还是pc
export function judgeDev() {
const userAgent = navigator.userAgent.toLowerCase()
return /ipad|iphone|midp|rv:1.2.3.4|ucweb|android|windows ce|windows mobile/.test(userAgent) ? 'H5' : 'PC'
}
7.复制文本
/**
* 点击复制 兼容ios
* @param { string,number } text 需要复制的文本
*/
export function copy (text) {
// 数字没有 .length 不能执行selectText 需要转化成字符串
const textString = text.toString()
let input = document.querySelector('#copy-input')
if (!input) {
input = document.createElement('input')
input.id = 'copy-input'
input.readOnly = 'readOnly' // 防止ios聚焦触发键盘事件
input.style.position = 'absolute'
input.style.left = '-1000px'
input.style.zIndex = '-1000'
document.body.appendChild(input)
}
input.value = textString
// ios必须先选中文字且不支持 input.select();
selectText(input, 0, textString.length)
console.log(document.execCommand('copy'), 'execCommand')
if (document.execCommand('copy')) {
document.execCommand('copy')
console.log('已经复制')
}
input.blur()
// input自带的select()方法在苹果端无法进行选择,所以需要自己去写一个类似的方法
// 选择文本。createTextRange(setSelectionRange)是input方法
function selectText(textbox, startIndex, stopIndex) {
if (textbox.createTextRange) {
// ie
const range = textbox.createTextRange()
range.collapse(true)
range.moveStart('character', startIndex) // 起始光标
range.moveEnd('character', stopIndex - startIndex) // 结束光标
range.select() // 不兼容苹果
} else {
// firefox/chrome
textbox.setSelectionRange(startIndex, stopIndex)
textbox.focus()
}
}
}
未完待续...