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 相关文章推荐
用JTrackBar实现的模拟苹果风格的滚动条
Aug 06 Javascript
JavaScript 基于原型的对象(创建、调用)
Oct 16 Javascript
js获取时间(本周、本季度、本月..)
Nov 22 Javascript
firefox下jquery ajax返回object XMLDocument处理方法
Jan 26 Javascript
JavaScript中的原型和继承详解(图文)
Jul 18 Javascript
JavaScript实现倒计时跳转页面功能【实用】
Dec 13 Javascript
JS闭包可被利用的常见场景小结
Apr 09 Javascript
JS实现评价的星星功能
Aug 20 Javascript
js实现rem自动匹配计算font-size的示例
Nov 18 Javascript
详解node child_process模块学习笔记
Jan 24 Javascript
Vue中遍历数组的新方法实例详解
Jul 21 Javascript
p5.js绘制创意自画像
Nov 04 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
轻松修复Discuz!数据库
2008/05/03 PHP
探讨如何在php168_cms中提取验证码
2013/06/08 PHP
PHP实现读取一个1G的文件大小
2013/08/24 PHP
php格式化金额函数分享
2015/02/02 PHP
PHP中key和current,next的联合运用实例分析
2016/03/29 PHP
PHP实现通过strace定位故障原因的方法
2018/04/29 PHP
javascript-简单的计算器实现步骤分解(附图)
2013/05/30 Javascript
jQuery判断div随滚动条滚动到一定位置后停止
2014/04/02 Javascript
原生js获取宽高与jquery获取宽高的方法关系对比
2014/04/04 Javascript
JS实现闪动的title消息提醒效果
2014/06/20 Javascript
简单的JS时钟实例讲解
2016/01/13 Javascript
javascript移动开发中touch触摸事件详解
2016/03/18 Javascript
AngularJs Javascript MVC 框架
2016/06/20 Javascript
JS获取鼠标相对位置的方法
2016/09/20 Javascript
解析jQueryEasyUI的使用
2016/11/22 Javascript
通过sails和阿里大于实现短信验证
2017/01/04 Javascript
学习使用Bootstrap输入框、导航、分页等常用组件
2017/05/11 Javascript
nodejs基于WS模块实现WebSocket聊天功能的方法
2018/01/12 NodeJs
Python获取暗黑破坏神3战网前1000命位玩家的英雄技能统计
2016/07/04 Python
Python使用pickle模块储存对象操作示例
2018/08/15 Python
Python中函数的基本定义与调用及内置函数详解
2019/05/13 Python
django从后台返回html代码的实例
2020/03/11 Python
实例讲解HTML5的meta标签的一些应用
2015/12/08 HTML / CSS
Pure Collection美国官网:来自英国羊绒专家的奢华羊绒
2017/11/19 全球购物
英国领先品牌手动工具和电动工具供应商:Tooled Up
2018/11/24 全球购物
成人大专自我鉴定范文
2013/10/19 职场文书
营业员个人总结的自我评价
2013/10/25 职场文书
市场营销个人求职信范文
2014/02/02 职场文书
计算机系本科生求职信
2014/05/31 职场文书
寒暑假实习证明书模板
2014/11/29 职场文书
邀请函怎么写
2015/01/30 职场文书
小学生交通安全寄语
2015/02/27 职场文书
幼儿园感恩节活动总结
2015/03/24 职场文书
留学推荐信(中英文版)
2015/03/26 职场文书
会议室管理制度范本
2015/08/06 职场文书
《异世界四重奏》剧场版6月10日上映 PV视觉图原创角色发表
2022/03/20 日漫