JS解惑之Object中的key是有序的么


Posted in Javascript onMay 06, 2019

当我们使用for/in遍历一个Object对象的时候,打印的结果是否按key的顺序打印出来呢?

答案是:不一定。

背景

最近在做一个项目的时候,遇到这样一个需求:

一个下拉列表中有3个固定选项,包括:-1:全部;0:正常;1:失效。

于是,我就定义了一个对象,然后循环这个对象,把结果放到 <option> 上面:

var obj = {
  '-1': '全部',
  '0' : '正常',
  '1' : '失效'
};
<!-- Vue代码片段 -->
<select>
  <option v-for="(item, key) in obj" :value="key">{{item}}</option>
</select>

<!-- 结果却是: -->
<!-- 0 正常 -->
<!-- 1 失效 -->
<!-- -1 全部 -->

于是就有了今天这篇文章,且看下文。

解惑

Object的key的排序规则到底是什么样子的呢?答案是:

如果key是整数(如:123)或者整数类型的字符串(如:“123”),那么会按照从小到大的排序。除此之外,其它数据类型,都安装对象key的实际创建顺序排序。

var obj = {
  '-1': '全部',
  '0' : '正常',
  '1' : '失效'
};
for (let key in obj) {
   console.log(key, obj[key]);
};
// result
// 0 正常
// 1 失效
// -1 全部

另外,如果key中除了整数或者整数类型的字符串外,还含有其它数据类型,则整数放在最前面,比如:

var obj = {
  'a': 111,
  '我' : 222,
  '1' : 333,
  '1.3': 444,
  '3': 555
};
for (let key in obj) {
   console.log(key, obj[key]);
};
// result
// 1 333
// 3 555
// a 111
// 我 222
// 1.3 444

解决

那还是上面的问题,我如何让对象按key的顺序输出呢?答案是:

将key转换成非整数类型的字符串,使用的时候再还原。

如果全部是类整数的key,则可以这么做:

// 每个key后面加.转换成字符串
var obj = {
  '-1.': '全部',
  '0.' : '正常',
  '1.' : '失效'
};
for (let key in obj) {
  // ~~ 表示转换成整数,这样上面的key又还原成了-1/0/1
  console.log(~~key, obj[key]);
};
// result
// -1 全部
// 0 正常
// 1 失效

但是,如果key是由各种数据类型混合的,那就不能转换成整数了,可以这么做:

// 每个key前面加.转换成字符串
var obj = {
  '.a': 111,
  '.我' : 222,
  '.1' : 333,
  '.1.3': 444,
  '.3': 555
};
for (let key in obj) {
  // 从第1个字符取原始的key
  console.log(key.substring(1), obj[key]);
};
// result
// a 111
// 我 222
// 1 333
// 1.3 444
// 3 555

最后

回归到我最初遇到的问题,那就这么解决了:

var obj = {
  '-1.': '全部',
  '0.' : '正常',
  '1.' : '失效'
};
<select>
  <option v-for="(item, key) in obj" :value="~~key">{{item}}</option>
</select>

参考

Objects#ordered-like-an-object

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Mootools 图片展示插件(lightbox,ImageMenu)收集集合
May 21 Javascript
使用GruntJS构建Web程序之构建篇
Jun 04 Javascript
网页收藏夹显示ICO图标(代码少)
Aug 04 Javascript
一步一步封装自己的HtmlHelper组件BootstrapHelper(三)
Sep 14 Javascript
jQuery实现弹出窗口弹出div层的实例代码
Jan 09 Javascript
微信小程序实战之上拉(分页加载)效果(2)
Apr 17 Javascript
jQuery使用eraser.js插件实现擦除、刮刮卡效果的方法【附eraser.js下载】
Apr 28 jQuery
weex slider实现滑动底部导航功能
Aug 28 Javascript
react中使用swiper的具体方法
May 15 Javascript
详解JS函数防抖
Jun 05 Javascript
vue使用canvas实现移动端手写签名
Sep 22 Javascript
使用vue-element-admin框架从后端动态获取菜单功能的实现
Apr 29 Vue.js
微信小程序和百度的语音识别接口详解
May 06 #Javascript
微信小程序生成海报分享朋友圈的实现方法
May 06 #Javascript
vue项目打包后上传至GitHub并实现github-pages的预览
May 06 #Javascript
Vue实现购物车的全选、单选、显示商品价格代码实例
May 06 #Javascript
JavaScript中关于base64的一些事
May 06 #Javascript
JavaScript中工厂函数与构造函数示例详解
May 06 #Javascript
微信小程序登录数据解密及状态维持实例详解
May 06 #Javascript
You might like
smarty模板中拼接字符串的方法
2014/02/14 PHP
codeigniter实现get分页的方法
2015/07/10 PHP
PHP扩展迁移为PHP7扩展兼容性问题记录
2016/02/15 PHP
phpQuery采集网页实现代码实例
2020/04/02 PHP
PHP获取真实IP及IP模拟方法解析
2020/11/24 PHP
JQuery优缺点分析说明
2011/04/10 Javascript
jquery实现树形二级菜单实例代码
2013/11/20 Javascript
JavaScript也谈内存优化
2014/06/06 Javascript
javascript从image转换为base64位编码的String
2014/07/29 Javascript
JSON与XML优缺点对比分析
2015/07/17 Javascript
前端开发之CSS原理详解
2017/03/11 Javascript
Bootstrap免费字体和图标网站(值得收藏)
2017/03/16 Javascript
Vue Ajax跨域请求实例详解
2017/06/20 Javascript
详解Node全局变量global模块
2017/09/28 Javascript
解决Vue axios post请求,后台获取不到数据的问题方法
2018/08/11 Javascript
10分钟彻底搞懂Http的强制缓存和协商缓存(小结)
2018/08/30 Javascript
在vue中根据光标的显示与消失实现下拉列表
2019/09/29 Javascript
VUE单页面切换动画代码(全网最好的切换效果)
2019/10/31 Javascript
vue实现整屏滚动切换
2020/06/29 Javascript
Python爬虫辅助利器PyQuery模块的安装使用攻略
2016/04/24 Python
Python 逐行分割大txt文件的方法
2017/10/10 Python
Python 列表理解及使用方法
2017/10/27 Python
python导入模块交叉引用的方法
2019/01/19 Python
Python实现查找字符串数组最长公共前缀示例
2019/03/27 Python
Python序列对象与String类型内置方法详解
2019/10/22 Python
美国知名的百货清仓店:Neiman Marcus Last Call
2016/08/03 全球购物
运动会四百米广播稿
2014/01/19 职场文书
初中班级口号
2014/06/09 职场文书
社区精神文明建设汇报材料
2014/08/17 职场文书
婚姻出轨保证书
2015/05/08 职场文书
百家讲坛观后感
2015/06/12 职场文书
2016年八一建军节活动总结
2016/04/05 职场文书
何时使用Map来代替普通的JS对象
2021/04/29 Javascript
快速学习Oracle触发器和游标
2021/06/30 Oracle
详解Python中下划线的5种含义
2021/07/15 Python
SpringBoot2零基础到精通之异常处理与web原生组件注入
2022/03/22 Java/Android