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动态创建div
Sep 25 Javascript
jquery中的$(document).ready()与window.onload的区别
Nov 18 Javascript
js Event对象的5种坐标
Sep 12 Javascript
Js表格万条数据瞬间加载实现代码
Feb 20 Javascript
js function定义函数的几种不错方法
Feb 27 Javascript
Node.js 条形码识别程序构建思路详解
Feb 14 Javascript
JavaScript中双符号的运算详解
Mar 12 Javascript
angular.js中解决跨域问题的三种方式
Jul 12 Javascript
js中null与空字符串&quot;&quot;的区别讲解
Jan 17 Javascript
详解如何用webpack4从零开始构建react开发环境
Jan 27 Javascript
JS实现图片轮播效果实例详解【可自动和手动】
Apr 04 Javascript
vue 解决data中定义图片相对路径页面不显示的问题
Aug 13 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冒泡排序算法的深入理解
2013/06/09 PHP
PHP遍历文件夹与文件类及处理类用法实例
2014/09/23 PHP
php实现复制移动文件的方法
2015/07/29 PHP
php实现简单的守护进程创建、开启与关闭操作
2019/08/13 PHP
window.open的功能全解析
2006/10/10 Javascript
找到了一篇jQuery与Prototype并存的冲突的解决方法
2007/08/29 Javascript
JavaScript 捕获窗口关闭事件
2009/07/26 Javascript
js模拟select下拉菜单控件的代码
2013/05/08 Javascript
php析构函数的具体用法小结
2014/03/11 Javascript
JSP中使用JavaScript动态插入删除输入框实现代码
2014/06/13 Javascript
jQuery之Deferred对象详解
2014/09/04 Javascript
jQuery DOM插入节点操作指南
2015/03/03 Javascript
js事件驱动机制 浏览器兼容处理方法
2016/07/23 Javascript
Javascript 闭包详解及实例代码
2016/11/30 Javascript
浅谈gulp创建完整的项目流程
2017/12/20 Javascript
详解webpack import()动态加载模块踩坑
2018/07/17 Javascript
Python HTMLParser模块解析html获取url实例
2015/04/08 Python
python通过imaplib模块读取gmail里邮件的方法
2015/05/08 Python
python+openCV利用摄像头实现人员活动检测
2019/06/22 Python
通过Python编写一个简单登录功能过程解析
2019/09/04 Python
详解使用python3.7配置开发钉钉群自定义机器人(2020年新版攻略)
2020/04/01 Python
在python中求分布函数相关的包实例
2020/04/15 Python
详解Tensorflow不同版本要求与CUDA及CUDNN版本对应关系
2020/08/04 Python
详解python中的三种命令行模块(sys.argv,argparse,click)
2020/12/15 Python
Python 中的函数装饰器和闭包详解
2021/02/06 Python
python抢购软件/插件/脚本附完整源码
2021/03/04 Python
中国酒类在线零售网站:酒仙网
2016/08/20 全球购物
最耐用行李箱,一箱永流传:Briggs & Riley(全球终身保修)
2017/12/07 全球购物
美国羽绒床上用品第一品牌:Pacific Coast
2018/08/25 全球购物
岳父生日宴会答谢词
2014/01/13 职场文书
竞选演讲稿范文大全
2014/05/12 职场文书
应届生求职自荐信
2014/07/04 职场文书
小学教师自我剖析材料
2014/09/29 职场文书
2015年护士节慰问信
2015/03/23 职场文书
2015年数学教师工作总结
2015/05/20 职场文书
Windows Server 2019 配置远程控制以及管理方法
2022/04/28 Servers