1.字符串占位宽度

  • 计算占位宽度:字符串的占位宽度除了涉及到具体的字符串内容,还与字体大小有关,可以将其放入Dom中来获取实际占位宽度
//计算字符串的占位宽度
function getTextWidth(str = '',font_size=12) {
const dom = document.createElement('span')
dom.style.display = 'inline-block'
dom.style['font-size'] = font_size + 'px'
dom.textContent = str
document.body.appendChild(dom)
const width = dom.clientWidth
document.body.removeChild(dom)
return width;
} //计算字符串数组中的最大宽度
function getMaxWidthByArray(text_arr=[],font_size=12){
//计算设备编号占位的最大宽度
var max_width = 0
text_arr.forEach(function(str){
var now_text_width = getTextWidth(str,font_size)
if(now_text_width > max_width){
max_width = now_text_width
}
})
return max_width
}

2.树形对象转换

  • 由来:多层级数据在存储时,是每个数据平级存储,通过id与pid字段进行进行关联,后台返回这些数据时,可能没经过转换,直接以数组形式返回,前端需要自己转换成树形对象
<script>
//封装方法:一维数组转树形对象
function buildTree(array, id = "id", parent_id = "pid") {
//不是数组则返回
if (!Array.isArray(array)) {
return []
}
// 创建临时对象
let temp = {};
// 创建需要返回的树形对象
let tree = {};
// 先遍历数组,将数组的每一项添加到temp对象中
for (let i in array) {
temp[array[i][id]] = array[i];
} // 遍历temp对象,将当前子节点与父节点建立连接
for (let i in temp) {
// 判断是否是根节点下的项
if (temp[i][parent_id] !== 0) {
//是否存在该父节点 存在才添加
if (temp[temp[i][parent_id]]) {
//父节点是否已经存在children属性 没有则新建
if (!temp[temp[i][parent_id]].children) {
temp[temp[i][parent_id]].children = new Array()
}
temp[temp[i][parent_id]].children.push(temp[i])
}
} else {
tree[temp[i][id]] = temp[i];
}
} return tree;
}
</script>
<script>
//待转换的数据格式
var menu_list = [
{
id: 1,
pid: 0,
title: "一级菜单"
},
{
id: 2,
pid: 1,
title: "二级菜单A"
},
{
id: 3,
pid: 1,
title: "二级菜单B"
}
]
//转换
var menu_tree = buildTree(menu_list, "id", "pid")
console.log(menu_tree)
</script>

  • 思路解析:

    1.函数假定条件:根节点id必须是0,也就是说一级节点的pid要==0

    2.先假设所有节点都是一级节点,设置临时对象进行存储,然后遍历临时对象中的key,将其挂载到对应的pid中

    3.遍历临时对象的节点,如果父节点是0,则添加到目标树形对象中,如果不是,则添加到对应的pid中(重要!!!,表面是给一级属性赋值,其实因为引用的关系,可能操作的是更深层次的节点)

    4.返回目标树形对象(没有找到pid的节点数据将被丢失)

  • 总结:正常的思路,都是操作树形对象,给所有的节点找到对应的pid节点进行挂载,因为pid是多层次嵌套的,为了找到对应的pid,通常所需要递归遍历,但是这里非常聪明,利用对象是引用类型的机制,直接操作一级节点来代替多层次嵌套节点

3.数字转换为金额格式

  • 使用toLocaleString()可将小数转成金额格式
  • 注意,如果是整数,需要转换成小数才能调用toLocaleString()
var num = 123456789
//转换成小数
num = parseFloat(num)
//转换金额格式
num.toLocaleString() //'123,456,789'
  • 封装一个方法:将数字的每个字符拆开遍历(从后往前)重新拼接,遇到第3*n个字符且不是最后一个字符,则额外多输出一个","
<script>
function numForamt(nun){
//转换成字符串,在转换成数组
var arr = (nun + '').split('')
//要输出的结果
var result = ""
//遍历数组元素,从后面开始,每3个元素就添加一个 ","
for(var i = arr.length - 1;i>=0;i--){
//当前下标(从前往后)
var index = arr.length - 1 - i
//是否是第3*n个字符,且不是最后一个字符,需要额外输出一个 ","
if((index + 1)%3 == 0 && index != (arr.length - 1)){
//拼接
result = ("," + arr[i] + result)
}else{
//拼接
result = (arr[i] + result)
}
} return result
}
console.log(numForamt(123456789)) //123,456,789
</script>

4.浮点数乘法

  • 浮点数直接计算会有问题,自己封装了一个,先转换乘整数进行计算,后除以对应的百分数即可
<script>
//小数乘法,转换为正数再计算,然后在除以对应的百分数
function floatMultiplication(value = 0, multiplier){
//转换为整数的函数
function toIntValue(_value){
//小数点下标
var index = _value.toString().indexOf('.')
//如果是整数,直接返回
if(index == -1){
return {
intValue: _value, divisor: 1
}
}
//小数点后的未数(需要被除的数)
var divisor = Math.pow(10, _value.toString().length - index - 1)
//转换为整数
var intValue = Number(_value.toString().slice(0,index) + _value.toString().slice(index+1))
return {
intValue, divisor
}
} //转换为正数计算,后再整除10的幂
var valueObj = toIntValue(value)
var multiplierObj = toIntValue(multiplier)
return (valueObj.intValue * multiplierObj.intValue) / (valueObj.divisor * multiplierObj.divisor)
} //原生测试 不准
console.log('1.5*1.2 = ',1.5*1.2) //1.7999999999999998 //测试
console.log(floatMultiplication(1.5,1.2)) //1.8
</script>

5.递归查询是否有目标值

  • 在多级嵌套的数据中,通过递归的方式查询是否存在目标值
  • 需要4个人参数:目标数据(数组或者对象),目标值,目标值所在的属性,嵌套数组的属性值
<script>
var list = [
{
value: 1, children: [
{
value: 2,
children: [
{
value: 3
},
{
value: 4
}
]
}
]
},
{
value: 5,children: [
{
value: 6
},
]
},
{
value: 7,children: [
{
value: 8
}
]
}
] //多级嵌套数据是否有目标值
//参数一:目标数据(数组或者对象)
//参数二:目标值
//参数三:目标属性
//参数四:数组属性名称
function hasValue(data = {},target_value = '', key = 'value', list_key = 'children'){
//数组类型
if(Array.isArray(data)){
//遍历元素,依次判断
for(var i=0;i<data.length;i++){
if(data[i][key] == target_value){
//已经找到匹配值 返回查找结果
return true }else if(data[i][list_key] && data[i][list_key].length > 0){
//没找到,从子元素中递归查找,并得到查找结果
var flag = hasValue(data[i][list_key],target_value)
//如果找到,则退出函数
if(flag){
return true
}
}
}
}else if(data && typeof data == 'object'){
//对象类型
if(data[key] == target_value){
//返回匹配结果
return true
}
}else{
//基本类型
if(data == target_value){
//返回匹配结果
return true
}
} //返回本轮查找结果(走到最后一步就是没找到)
return false
} var flag = hasValue(list,5)
</script>

Javascript 常用封装(二)的更多相关文章

  1. javascript 常用手势 分析

    javascript 常用手势, 个人觉得有3个 tap,swipe(swipeLeft,swipeRight,swipeTop,swipeRight),hold tap 是轻击 判断的原则是,在to ...

  2. Javascript常用的设计模式详解

    Javascript常用的设计模式详解 阅读目录 一:理解工厂模式 二:理解单体模式 三:理解模块模式 四:理解代理模式 五:理解职责链模式 六:命令模式的理解: 七:模板方法模式 八:理解javas ...

  3. 原生JavaScript常用本地浏览器存储方法一(方法类型)

    有时需要将网页中的一些数据保存在浏览器端.好处就是当下次访问页面时,直接就可以从本地读取数据,不需要再次向服务器请求数据.目前常用的有以下几种方法: 1.cookie cookie会随着每次HTTP请 ...

  4. JavaScript 常用功能总结

    小编吐血整理加上翻译,太辛苦了~求赞! 本文主要总结了JavaScript 常用功能总结,如一些常用的JS 对象,基本数据结构,功能函数等,还有一些常用的设计模式. 目录: 众所周知,JavaScri ...

  5. JavaScript基础笔记二

    一.函数返回值1.什么是函数返回值    函数的执行结果2. 可以没有return // 没有return或者return后面为空则会返回undefined3.一个函数应该只返回一种类型的值 二.可变 ...

  6. JavaScript基本概念(二)

    JavaScript 基本概念(二) 操作符和语句 目录 操作符 一元操作符 位操作符 布尔操作符 乘性操作符 其他操作符 语句部分 说起操作符,回忆下上一篇文章末尾说的话. 操作符 一元操作符 ++ ...

  7. javascript常用代码大全

    http://caibaojian.com/288.html    原文链接 jquery选中radio //如果之前有选中的,则把选中radio取消掉 $("#tj_cat .pro_ca ...

  8. Javascript 常用函数【3】

    jquery选中radio //如果之前有选中的,则把选中radio取消掉 $("#tj_cat .pro_category").each(function() { if ($(t ...

  9. javascript常用知识点集

    javascript常用知识点集 目录结构 一.jquery源码中常见知识点 二.javascript中原型链常见的知识点 三.常用的方法集知识点 一.jquery源码中常见的知识点 1.string ...

  10. 第一百三十节,JavaScript,封装库--连缀

    JavaScript,封装库--连缀 学习要点: 1.连缀介绍 2.改写库对象 本章我们重点来介绍,在调用库的时候,我们需要能够在前台调用的时候可以同时设置多个操作,比如设置CSS,设置innerHT ...

随机推荐

  1. VMware安装CentOS7及远程登录详细教程

    写在前面 主要使用软件: VMware Workstation Pro17 Navicat Premium17 Xshell7 Xftp7 1.在虚拟机安装CentOS7 访问阿里云镜像站 ,选择标记 ...

  2. frp_v0.37.1内网穿透,内网服务公网用不求人

    前言: 公司内网无法访问,出差又需要用到公司内网进行办公,苦恼了好一阵.这时候想到了内网穿透,这就不得不提到几年前被安利的frp,一看GitHub竟然已经5年了,网上估计大把教程了. 那么什么是frp ...

  3. CSS – Dimension min-content, max-content, fit-content

    前言 无意间在 practice 的时候看到视频使用, 以前没有听过. 它有点像 Figma 的 hug content, 据说 CSS 2.1 也是有类似的概念, 只是没有被正式纳入 CSS 里. ...

  4. 关于 B 先生

    B 先生是不是要疯了,他今天说的都是他妈什么几把

  5. foobar2000 v2.1.3 汉化版(更新日期:2024.04.02)

    foobar2000 v2.1.3 汉化版 -----------------------[软件截图]---------------------- -----------------------[软件 ...

  6. PasteForm最佳CRUD实践,实际案例PasteTemplate详解之3000问(四)

    无论100个表还是30个表,在使用PasteForm模式的时候,管理端的页面是一样的,大概4个页面, 利用不同操作模式下的不同dto数据模型,通过后端修改对应的dto可以做到控制前端的UI,在没有特别 ...

  7. C++第七节课 new开辟空间 delete释放空间

    #include <iostream> using namespace std; // C中开辟空间的方式 所有的返回值 都是 void * /// int * p = (int*)mal ...

  8. 从url地址获取主机名

    function getHost(url) { var host = "null"; if(typeof url == "undefined"|| null = ...

  9. 中通快递关键业务和复杂架构挑战下的 Kubernetes 集群服务暴露实践

    本文是上海站 Meetup 讲师王文虎根据其分享内容整理的文章. KubeSphere 社区的小伙伴们,大家好.我是中通快递容器云平台的研发工程师王文虎,主要负责中通快递容器云平台开发.应用容器化推广 ...

  10. 云原生爱好者周刊:KubeKey v2.1.0 alpha 版发布!

    KubeKey v2.1.0-alpha.0 发布啦!该版本的主要特性: 支持三种使用场景的 Etcd 集群(二进制部署,Kubeadm 部署,连接外置已存在的 Etcd 集群). 支持部署 Cont ...