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 相关文章推荐
原型方法的不同写法居然会影响调试的解决方法
Mar 08 Javascript
javascript函数库-集合框架
Apr 27 Javascript
Javascript 面向对象之重载
May 04 Javascript
javascript代码运行不出来执行错误的可能情况整理
Oct 18 Javascript
js图片卷帘门导航菜单特效代码分享
Sep 10 Javascript
基于JS2Image实现圣诞树代码
Dec 24 Javascript
jQuery 如何给Carousel插件添加新的功能
Apr 18 Javascript
jQuery页面元素动态添加后绑定事件丢失方法,非 live
Jun 16 Javascript
用jquery快速解决IE输入框不能输入的问题
Oct 04 Javascript
BootStrap中
Dec 10 Javascript
微信小程序 动态的设置图片的高度和宽度详解及实例代码
Feb 24 Javascript
JavaScript设计模式之策略模式详解
Jun 09 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
生成sessionid和随机密码的例子
2006/10/09 PHP
深入array multisort排序原理的详解
2013/06/18 PHP
php数组删除元素示例
2014/03/21 PHP
json数据与字符串的相互转化示例
2013/09/18 Javascript
JS中引用百度地图并将百度地图的logo和信息去掉
2013/09/29 Javascript
js控制淡入淡出示例代码
2013/11/12 Javascript
基于jquery扩展漂亮的下拉框可以二次修改
2013/11/19 Javascript
SuperSlide2实现图片滚动特效
2014/06/20 Javascript
javascript动态修改Li节点值的方法
2015/01/20 Javascript
JavaScript中判断变量是数组、函数或是对象类型的方法
2015/02/25 Javascript
jQuery基于toggle实现click触发DIV的显示与隐藏问题分析
2016/06/12 Javascript
jquery设置表单元素为不可用的简单代码
2016/07/04 Javascript
BootstrapValidator不触发校验的实现代码
2016/09/28 Javascript
vue 2.0封装model组件的方法
2017/08/03 Javascript
老生常谈JavaScript面向对象基础与this指向问题
2017/10/16 Javascript
Vue.js 实现数据展示全部和收起功能
2018/09/05 Javascript
使用VueCli3+TypeScript+Vuex一步步构建todoList的方法
2019/07/25 Javascript
小程序实现左滑删除效果
2019/07/25 Javascript
JS桶排序的简单理解与实现方法示例
2019/11/25 Javascript
javascript前端实现多视频上传
2020/12/13 Javascript
Python爬虫:通过关键字爬取百度图片
2017/02/17 Python
Python实现运行其他程序的四种方式实例分析
2017/08/17 Python
python实现求解列表中元素的排列和组合问题
2018/03/15 Python
如何使用python爬虫爬取要登陆的网站
2019/07/12 Python
django实现类似触发器的功能
2019/11/15 Python
Python+redis通过限流保护高并发系统
2020/04/15 Python
python suds访问webservice服务实现
2020/06/26 Python
英国最大的手表网站:The Watch Hut
2017/03/31 全球购物
世界上最伟大的马产品:Equiderma
2020/01/07 全球购物
倡议书格式范文
2014/04/14 职场文书
环境日宣传活动总结
2014/07/09 职场文书
2014教育局对照检查材料思想汇报
2014/09/23 职场文书
4S店客服专员岗位职责
2015/04/07 职场文书
原生JavaScript实现简单五子棋游戏
2021/06/28 Javascript
关于React Native使用axios进行网络请求的方法
2021/08/02 Javascript
使用Postman测试需要授权的接口问题
2022/06/21 Java/Android