尴尬,通篇使用 if
以给博客园头部导航条链接添加图标为例, 接下来看看如何分别使用对象、数组、Map 优化它的。
前置
1.接下来给头部导航条添的图标包含:
- 博客园首页
- 新随笔
- 博客首页
- 联系
- 订阅
- 管理
2.这里封装了一个返回 svg 的 function, 下文的 iconInSvg(icon) 即是调用了这个方法。
function iconInSvg(icon) {
return `
<svg class="icon" aria-hidden="true">
<use xlink:href="${icon}"></use>
</svg>
`
}
用if罗列
博客园可以在 管理 -> 选项 界面禁用一些链接, 所以在添加 svg 图标之前需要判断链接是否存在。
import { cnblog, home, pens, contact, rss, admin } from '../constants/icons'
import { iconInSvg } from '@tools'
function setNavIcons() {
// 博客园首页
if ($('#blog_nav_sitehome').length !== 0) {
$('#blog_nav_sitehome').prepend(iconInSvg(cnblog))
}
// 博客首页
if ($('#blog_nav_myhome').length !== 0) {
$('#blog_nav_myhome').prepend(iconInSvg(home))
}
// 新随笔
if ($('#blog_nav_newpost').length !== 0) {
$('#blog_nav_newpost').prepend(iconInSvg(pens))
}
// 联系
if ($('#blog_nav_contact').length !== 0) {
$('#blog_nav_contact').prepend(iconInSvg(contact))
}
// 订阅
if ($('#blog_nav_rss').length !== 0) {
$('#blog_nav_rss').prepend(iconInSvg(rss))
}
// 管理
if ($('#blog_nav_admin').length !== 0) {
$('#blog_nav_admin').prepend(iconInSvg(admin))
}
}
export default setNavIcons
可以发现代码有大量重复,思考如何优化代码。将选择器和图标抽离,以 key value 的形式一一对应,然后进行遍历,执行相同的逻辑:先判断再插入图标。
使用对象
const items = {
'#blog_nav_sitehome': cnblog,
'#blog_nav_myhome': home,
'#blog_nav_newpost': pens,
'#blog_nav_contact': contact,
'#blog_nav_rss': rss,
'#blog_nav_admin': admin,
}
for (let selector in items) {
if ($(selector).length !== 0) {
$(selector).prepend(iconInSvg(items[selector]))
}
}
- js的对象本质上是键值对的集合(Hash结构),如果给对象设置为一个不为字符串的 key,会自动转为字符串
- 这里直接设置 key 为字符串,需要使用
[]来取其值
使用数组
针对给头部导航条添加图标的场景,使用对象重写这段代码应该是最方便的解法了。接下来使用数组对象的形式将它重写,并进行对比。
const items = [
{ selector: '#blog_nav_sitehome', icon: cnblog },
{ selector: '#blog_nav_myhome', icon: home },
{ selector: '#blog_nav_newpost', icon: pens },
{ selector: '#blog_nav_contact', icon: contact },
{ selector: '#blog_nav_rss', icon: rss },
{ selector: '#blog_nav_admin', icon: admin },
]
for (let { selector, icon } of items) {
if ($(selector).length !== 0) {
$(selector).prepend(iconInSvg(icon))
}
}
- 数组对象的形式描述的更加清晰
- 在这种数据结构下,通过结构赋值能够快速取到值
- 循环体内的代码更易读
相比后面的 Map 数据结构,在这个场景下我更喜欢用数组对象的形式。
试试 Map
由于 js 对象的 key 本质上只能使用字符串,这就带来一定的局限性。Map 结构提供了“值—值”的对应,是一种更完善的 Hash 结构实现。“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。接下来使用 Map 重写这段代码。
const items = new Map([
['#blog_nav_sitehome', cnblog],
['#blog_nav_myhome', home],
['#blog_nav_newpost', pens],
['#blog_nav_contact', contact],
['#blog_nav_rss', rss],
['#blog_nav_admin', admin],
])
for (let [selector, icon] of items.entries()) {
if ($(selector).length !== 0) {
$(selector).prepend(iconInSvg(icon))
}
}
这个小项目虽然使用了 babel 来处理 es6,但 Map 无法像class那样被转化,class 是语法糖。Map 真是个好东西,如果你不需要兼容IE9以下的话。

总结
各有好处。需要注意的是,for of的效率没有带索引的遍历方式高,当你需要遍历大量数据时,最好换用其它方式遍历数据。如有错误,欢迎指正!
尴尬,通篇使用 if的更多相关文章
- 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
腾讯优测是专业的移动自动化测试平台,提供多维度的自动化测试服务,让测试更简单! 近期有报道称,澳大利亚悉尼市新某大学的一名男生在课堂上看电影,不料耳机没有插好,变成了现场直播... 如果你认为耳机没插 ...
- 【C语言学习趣事】_32_平胸的尴尬,嫁不出去的姑娘
为什么写这篇文章呢? 为什么要弄这么个题目呢? 首先解释为什么用这个题目.这一切都要从那天在QQ群中的讨论说起,那天在群中,一个哥们问了一个关于(void)0 的问题.然后大家说到了 (void)0和 ...
- 移动设备页面高度不足时min-height 的尴尬处理
移动设备页面高度不足时min-height 的尴尬处理 在做html5的页面时,经常遇到页面内容太少撑不起来整个手机屏幕的高度. 我们经常使用min-height来处理,比如min-height:56 ...
- 截图技巧——鼠标按着不懂,同时点击截图快捷键(QQ为ctrl+alt+a)即可避免按下快捷键鼠标按下等操作消失截不到的尴尬。
截图技巧--鼠标按着不懂,同时点击截图快捷键(QQ为ctrl+alt+a)即可避免按下快捷键鼠标按下等操作消失截不到的尴尬.
- Computer Vision的尴尬---by林达华
Computer Vision的尴尬---by林达华 Computer Vision是AI的一个非常活跃的领域,每年大会小会不断,发表的文章数以千计(单是CVPR每年就录取300多,各种二流会议每年的 ...
- 用SHELL与列表处理了件尴尬事
与列表语法 command-1 && command-2 && command-3 && command-4 && ...command ...
- Ajax与CustomErrors的尴尬
在ASP.NET程序中,为了给用户显示友好的错误信息,通常在web.config中进行如下的设置: <customErrors mode="RemoteOnly" defau ...
- ZZNU 1992: 情人节的尴尬
题目描述 情人节这不刚过去没多久吗,我得给大家爆个料.这个事关于小飞飞的,小飞飞呢,要给她女票买礼物,但是呢有个比较尴尬的事情,小飞飞有些钱在某宝里,有些钱在某东里,众所周知,这俩可是死对头,想相互转 ...
- ZOJ2006 一道很尴尬的string操作题
ZOJ2006(最小表示法) 题目大意:输出第一个字符串的最小字典序字串的下标! 然后我居然想试一试string的erase的能力,暴力一下,然后20msAC了,尴尬的数据.......... #in ...
随机推荐
- 读《Java并发编程的艺术》学习笔记(二)
第2章 Java并发机制的底层实现原理 Java代码在编译后变成字节码,字节码被类加载器加载到JVM中,JVM执行字节码,最终转换为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实 ...
- 从String到==和hashcode
public static void main(String[] args) { String s1 = "ni"; String s2 = "hao"; St ...
- 【Java实用工具】——使用oshi获取主机信息
最近在筹划做一个监控系统.其中就要获取主机信息,其中遇到一些问题.在此做个记录,以便以后查阅. 在该监控系统中,想要做到主机的CPU.内存.磁盘.网络.线程.JVM内存.JVM GC 等维度的监控,J ...
- R语言实战(三) 图形初阶
3.1 使用图形 plot:基础绘图 abline:添加回归直线 hist:绘制直方图 boxplot:绘制箱线图 dev.new():returns the return value of the ...
- Yaml文件,超详细讲解
YAML文件简单介绍 YAML 是一种可读性非常高,与程序语言数据结构非常接近.同时具备丰富的表达能力和可扩展性,并且易于使用的数据标记语言. YAML全称其实是"YAML Ain't a ...
- 关于emgucv控制多摄像头问题
看到这篇文章你或许已经查阅很多资料,也可能你刚准备深入研究,但是关于调用多摄像头问题我要说明一点,关于多摄像头调用 取决于你电脑本身USB控制器数量,不是说你电脑上5个usb就可以同时控制5台摄像头, ...
- Jenkins+Ant+JMeter集成
Tomcat是jenkins运行的容器,jenkins实际上是依赖于Tomcat才能启动的.Jenkins可以调度ant的脚本. Ant和maven类似,maven是执行pom文件,ant是执行bui ...
- vue使用lodop打印控件实现浏览器兼容打印
前言 此控件直接进行打印底部会有水印,通过官网购买可以解决: 如不想购买,可先执行预览,弹出预览框进行打印: 需要用到的js文件和api文档附后,请注意查看. 首先需要在局部或全局引入LodopFun ...
- 入门Python实现七夕表白神器
from PIL import Image, ImageDraw, ImageFont font_size = 7 #This var can change the Word's blank size ...
- 【简介】OpenOCD 由jtag操作到parport driver流程
1. 定义 jtag_command_type 在 OpenOCD 中,JTag 命令在枚举 jtag_command_type 中定义,定义如下: /** * The type of the @c ...