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 相关文章推荐
关于juqery radio写法的兼容性问题(新老版本jquery)
Jun 14 Javascript
JavaScript 操作键盘的Enter事件(键盘任何事件),兼容多浏览器
Oct 11 Javascript
下拉列表选择项的选中在不同浏览器中的兼容性问题探讨
Sep 18 Javascript
javascript如何创建表格(javascript绘制表格的二种方法)
Dec 10 Javascript
javascript获取和判断浏览器窗口、屏幕、网页的高度、宽度等
May 08 Javascript
JavaScript中获取样式的原生方法小结
Oct 08 Javascript
Bootstrap的Refresh Icon也spin起来
Jul 13 Javascript
JS闭包与延迟求值用法示例
Dec 22 Javascript
vue axios请求拦截实例代码
Mar 29 Javascript
vue-cli 项目打包完成后运行文件路径报错问题
Jul 19 Javascript
vue 实现LED数字时钟效果(开箱即用)
Dec 08 Javascript
关于vue3默认把所有onSomething当作v-on事件绑定的思考
May 15 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
一个可查询所有表的“通用”查询分页类
2006/10/09 PHP
用来解析.htgroup文件的PHP类
2012/09/05 PHP
PHP之短标签开启设置
2013/06/17 PHP
php数组冒泡排序算法实例
2016/05/06 PHP
通过修改Laravel Auth使用salt和password进行认证用户详解
2017/08/17 PHP
PHP PDOStatement::setAttribute讲解
2019/02/01 PHP
PHP经典设计模式之依赖注入定义与用法详解
2019/05/21 PHP
爱恋千雪-US-AscII加密解密工具(网页加密)下载
2007/06/06 Javascript
Node.js(安装,启动,测试)
2014/06/09 Javascript
jQuery中width()方法用法实例
2014/12/24 Javascript
详解JavaScript中getFullYear()方法的使用
2015/06/10 Javascript
使用Ajax与服务器(JSON)通信实例
2016/11/04 Javascript
关于在mongoose中填充外键的方法详解
2017/08/14 Javascript
Gulp实现静态网页模块化的方法详解
2018/01/09 Javascript
jQuery实现的简单图片轮播效果完整示例
2018/02/08 jQuery
微信小程序学习笔记之目录结构、基本配置图文详解
2019/03/28 Javascript
微信小程序如何加载数据库真实数据的实现
2020/03/04 Javascript
Python实现的百度站长自动URL提交小工具
2014/06/27 Python
Python用imghdr模块识别图片格式实例解析
2018/01/11 Python
python 平衡二叉树实现代码示例
2018/07/07 Python
Python中实现单例模式的n种方式和原理
2018/11/14 Python
python爬虫超时的处理的实例
2018/12/19 Python
pytorch masked_fill报错的解决
2020/02/18 Python
html5通过canvas实现刮刮卡效果示例分享
2014/01/27 HTML / CSS
分享29个基于Bootstrap的HTML5响应式网页设计模板
2015/11/19 HTML / CSS
德国珠宝和手表在线商店:VALMANO
2019/03/24 全球购物
阿迪达斯希腊官方网上商店:adidas希腊
2019/04/06 全球购物
汽车检测与维修个人求职信
2013/09/24 职场文书
个人找工作求职简历的自我评价
2013/10/20 职场文书
市场营销专业毕业生自荐信
2013/11/02 职场文书
学校采购员岗位职责
2014/01/02 职场文书
银行存款证明样本
2014/01/17 职场文书
员工自我评价范文
2015/03/11 职场文书
个人维稳承诺书
2015/05/04 职场文书
详解python中[-1]、[:-1]、[::-1]、[n::-1]使用方法
2021/04/25 Python
flex弹性布局详解
2022/03/20 HTML / CSS