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 相关文章推荐
学习js所必须要知道的一些
Mar 07 Javascript
File文件控件,选中文件(图片,flash,视频)即立即预览显示
Apr 09 Javascript
正则表达式搭配js轻松处理json文本方便而老古
Feb 17 Javascript
javascript禁制后退键(Backspace)实例代码
Nov 15 Javascript
jQuery中change事件用法实例
Dec 26 Javascript
javascript实现根据汉字获取简拼
Sep 25 Javascript
Angular CLI 安装和使用教程
Sep 13 Javascript
微信小程序使用input组件实现密码框功能【附源码下载】
Dec 11 Javascript
vue引入js数字小键盘的实现代码
May 14 Javascript
基于D3.js实现时钟效果
Jul 17 Javascript
Vue实现点击箭头上下移动效果
Jun 11 Javascript
js实现前端界面导航栏下拉列表
Aug 27 Javascript
微信小程序和百度的语音识别接口详解
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
用PHP中的 == 运算符进行字符串比较
2006/11/26 PHP
PHP中for循环语句的几种变型
2006/11/26 PHP
PHP 5.0对象模型深度探索之类的静态成员
2008/03/27 PHP
深入理解curl类,可用于模拟get,post和curl下载
2013/06/08 PHP
php自定义session示例分享
2014/04/22 PHP
PHP定时执行任务的3种方法详解
2015/12/21 PHP
PHP defined()函数的使用图文详解
2019/07/20 PHP
javascript 学习笔记(一)DOM基本操作
2011/04/08 Javascript
js css 实现遮罩层覆盖其他页面元素附图
2014/09/22 Javascript
用jquery模仿的a的title属性的例子
2014/10/22 Javascript
JQuery boxy插件在IE中边角图片不显示问题的解决
2015/05/20 Javascript
用js实现放大镜的效果的简单实例
2016/05/23 Javascript
使用jquery提交form表单并自定义action的实现代码
2016/05/25 Javascript
js事件冒泡、事件捕获和阻止默认事件详解
2016/08/04 Javascript
Vue.js -- 过滤器使用总结
2017/02/18 Javascript
react路由配置方式详解
2017/08/07 Javascript
vue.js实现只弹一次弹框
2018/01/29 Javascript
基于vue实现可搜索下拉框定制组件
2020/03/26 Javascript
小程序点赞收藏功能的实现代码示例
2018/09/07 Javascript
swiper在angularjs中使用循环轮播失效的解决方法
2018/09/27 Javascript
小程序点击图片实现自动播放视频
2020/05/29 Javascript
微信小程序使用websocket通讯的demo,含前后端代码,亲测可用
2019/05/22 Javascript
小程序实现短信登录倒计时
2019/07/12 Javascript
基于javascript canvas实现五子棋游戏
2020/07/08 Javascript
在Vue中使用mockjs代码实例
2020/11/25 Vue.js
vue3自定义dialog、modal组件的方法
2021/01/04 Vue.js
linux服务器快速卸载安装node环境(简单上手)
2021/02/22 Javascript
python提示No module named images的解决方法
2014/09/29 Python
Python 使用SMTP发送邮件的代码小结
2016/09/21 Python
Python数据类型之String字符串实例详解
2019/05/08 Python
Python操作Excel工作簿的示例代码(\*.xlsx)
2020/03/23 Python
解决margin 外边距合并问题
2019/07/03 HTML / CSS
CSS3实现淘宝留白的方法
2020/06/05 HTML / CSS
竞选班干部演讲稿100字
2014/08/20 职场文书
社区活动策划方案
2014/08/21 职场文书
机关党员四风问题个人整改措施
2014/10/26 职场文书