背景
当我们使用 for...in 遍历一个Object对象时,打印的结构是否按key的顺序打印出来呢?
答案是:不一定
如case1:1
2
3
4
5
6
7
8
9
10
11
12
13
14var obj = {
  '-1': '全部',
  '0' : '正常',
  '1' : '失效'
};
for (let key in obj) {
  console.log(key, obj[key]);
}
/*
'0' 正常
'1' 失效
'-1' 全部
*/
解惑
Object的key的排序规则到底是什么样的呢?答案是:
如果key是 0、正整数或字符串0、字符串正整数,则安排从小到大排序,如果有其他的数据,安排创建顺序排列。
如case2:
| 1 | var obj = { | 
解决办法
对于case1,如何让key顺序输出呢?可以先将key换成非整数类型的字符串,输出的时候再还原。
改造case1:1
2
3
4
5
6
7
8
9
10
11
12
13var obj = {
  '-1.': '全部',
  '0.' : '正常',
  '1.' : '失效'
}
for (let key in obj) {
  console.log(~~key, obj[key]);
}
/*
'-1' 全部
'0' 正常
'1' 失效
*/
但如果是case2各种数据类型混合的情况,就不能使用~~了1
2
3
4
5
6
7
8
9var obj = {
  '.a': 1,
  '.你' : 2,
  '.1' : 3,
  '.2.1' : 3
};
for (let key in obj) {
  console.log(key.substring(1), obj[key]);
}