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 操作css实现代码
Jun 11 Javascript
一个可以兼容IE FF的加为首页与加入收藏实现代码
Nov 02 Javascript
数组Array进行原型prototype扩展后带来的for in遍历问题
Feb 07 Javascript
jQuery powerFloat万能浮动层下拉层插件使用介绍
Dec 27 Javascript
JS 添加千分位与去掉千分位的示例
Jul 11 Javascript
js 判断文件类型并控制表单提交示例代码
Nov 14 Javascript
js 与 php 通过json数据进行通讯示例
Mar 26 Javascript
Bootstrap组件之下拉菜单,多级菜单及按钮布局方法实例
May 25 Javascript
clipboard在vue中的使用的方法示例
Oct 19 Javascript
jQuery时间戳和日期相互转换操作示例
Dec 07 jQuery
Vue中jsx不完全应用指南小结
Nov 01 Javascript
四十九个javascript小知识实用技巧
Nov 20 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/08/15 PHP
php提示Warning:mysql_fetch_array() expects的解决方法
2014/12/16 PHP
php设计模式之享元模式分析【星际争霸游戏案例】
2020/03/23 PHP
javascript firefox不显示本地预览图片问题的解决方法
2008/11/12 Javascript
一起来写段JS drag拖动代码
2010/12/09 Javascript
Jquery在指定DIV加载HTML示例代码
2014/02/17 Javascript
jQuery修改li下的样式以及li下的img的src的值的方法
2014/11/02 Javascript
nodejs教程之入门
2014/11/21 NodeJs
node.js中的fs.truncateSync方法使用说明
2014/12/15 Javascript
jquery实现textarea输入框限制字数的方法
2015/01/15 Javascript
js实现图片漂浮效果的方法
2015/03/02 Javascript
JavaScript阻止浏览器返回按钮的方法
2015/03/18 Javascript
jQuery.deferred对象使用详解
2016/03/18 Javascript
jQuery实现带延时功能的水平多级菜单效果【附demo源码下载】
2016/09/21 Javascript
微信小程序 教程之注册页面
2016/10/17 Javascript
JavaScript数据结构之二叉树的删除算法示例
2017/04/13 Javascript
Vue3项目打包后部署到服务器 请求不到后台接口解决方法
2020/02/06 Javascript
python中的文件打开与关闭操作命令介绍
2018/04/26 Python
python中将\\uxxxx转换为Unicode字符串的方法
2018/09/06 Python
Python多进程池 multiprocessing Pool用法示例
2018/09/07 Python
在Python中居然可以定义两个同名通参数的函数
2019/01/31 Python
Python Django2.0集成Celery4.1教程
2019/11/19 Python
HTML5实现音频和视频嵌入的方法
2018/08/22 HTML / CSS
Origins悦木之源香港官网:雅诗兰黛集团高端植物护肤品牌
2018/03/21 全球购物
JD Sports芬兰:英国领先的运动鞋和运动服饰零售商
2018/11/16 全球购物
某IT外企面试题-二分法求方程!看看大家的C++功底
2015/07/04 面试题
部队领导证婚词
2014/01/12 职场文书
质量承诺书范文
2014/03/27 职场文书
民政局个人整改措施
2014/09/24 职场文书
校园安全广播稿范文
2014/09/25 职场文书
2015年公司行政后勤工作总结
2015/05/20 职场文书
论语读书笔记
2015/06/26 职场文书
Python基础之教你怎么在M1系统上使用pandas
2021/05/08 Python
Pytorch中使用ImageFolder读取数据集时忽略特定文件
2022/03/23 Python
Python万能模板案例之matplotlib绘制甘特图
2022/04/13 Python
Python绘制散点图之可视化神器pyecharts
2022/07/07 Python