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 相关文章推荐
My Desktop :) 桌面式代码
Dec 29 Javascript
Javascript 静态页面实现随机显示广告的办法
Nov 17 Javascript
Extjs中TabPane如何嵌套在其他网页中实现思路及代码
Jan 27 Javascript
js/jQuery对象互转(快速操作dom元素)
Feb 04 Javascript
浅谈js的setInterval事件
Dec 05 Javascript
jQuery+ajax实现滚动到页面底部自动加载图文列表效果(类似图片懒加载)
Jun 07 Javascript
vue分页组件table-pagebar使用实例解析
Nov 15 Javascript
Angular.js中ng-include用法及多标签页面的实现方式详解
May 07 Javascript
微信小程序 生命周期函数详解
May 24 Javascript
使用vue如何构建一个自动建站项目
Feb 05 Javascript
inquirer.js一个用户与命令行交互的工具详解
May 18 Javascript
vue通过video.js解决m3u8视频播放格式的方法
Jul 30 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
Terran热键控制
2020/03/14 星际争霸
php中数字、字符与对象判断函数用法实例
2014/11/26 PHP
Django 标签筛选的实现代码(一对多、多对多)
2018/09/05 PHP
PHP cookie与session会话基本用法实例分析
2019/11/18 PHP
js 调整select 位置的函数
2008/02/21 Javascript
document.body.scrollTop 值总为0的解决方法 比较常见的标准问题
2009/11/30 Javascript
纯javascript制作日历控件
2015/07/17 Javascript
全系IE支持Bootstrap的解决方法
2015/10/19 Javascript
Jquery ajax加载等待执行结束再继续执行下面代码操作
2015/11/24 Javascript
详解javascript高级定时器
2015/12/31 Javascript
Jquery实现的简单轮播效果【附实例】
2016/04/19 Javascript
浅谈Vuex@2.3.0 中的 state 支持函数申明
2017/11/22 Javascript
vue 自定义 select内置组件
2018/04/10 Javascript
Vue 监听列表item渲染事件方法
2018/09/06 Javascript
Vuex的actions属性的具体使用
2019/04/14 Javascript
详解django模板与vue.js冲突问题
2019/07/07 Javascript
详解Vue.js和layui日期控件冲突问题解决办法
2019/07/25 Javascript
jquery 回调操作实例分析【回调成功与回调失败的情况】
2019/09/27 jQuery
vue实现简单瀑布流布局
2020/05/28 Javascript
js瀑布流布局的实现
2020/06/28 Javascript
js异步接口并发数量控制的方法示例
2020/11/22 Javascript
[00:17]游戏风云独家报道:DD赛后说出数字秘密 吓死你们啊!
2014/07/13 DOTA
基于python实现聊天室程序
2018/07/27 Python
python执行CMD指令,并获取返回的方法
2018/12/19 Python
python 抓包保存为pcap文件并解析的实例
2019/07/23 Python
win10下安装Anaconda的教程(python环境+jupyter_notebook)
2019/10/23 Python
Django重设Admin密码过程解析
2020/02/10 Python
Python 实现一个简单的web服务器
2021/01/03 Python
用CSS3实现无限循环的无缝滚动的示例代码
2017/11/01 HTML / CSS
CSS3 border-radius圆角的实现方法及用法详解
2020/09/14 HTML / CSS
Amaze UI 文件选择域的示例代码
2020/08/26 HTML / CSS
巴西女装购物网站:Eclectic
2018/04/24 全球购物
时尚圣经:The Fashion Bible
2019/03/03 全球购物
盖尔斯工厂店:GUESS Factory
2020/01/21 全球购物
教师纪念9.18事件演讲稿范文
2014/09/14 职场文书
社区个人对照检查材料(群众路线)
2014/09/26 职场文书