js遍历json对象顺序问题,使用for in遍历json对象发现排序了,和本来的顺序不一样,有啥解决办法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js遍历json对象顺序问题,使用for in遍历json对象发现排序了,和本来的顺序不一样,有啥解决办法相关的知识,希望对你有一定的参考价值。

json的结构是这样var a=
"3":'第一',
"1":'第二',
"5":'第三',

遍历后需要按原顺序输出,但使用for in会自动排序,输出结果变成了第二 第一 第三,有什么办法解决

参考技术A var a=
"3":'第一',
"1":'第二',
"5":'第三',
;
var tmp = JSON.stringify(a);
tmp = tmp.replace(/([\\,])([^:]+):([^:,]+)(?=[,\\])/g,"$1$3:$2");
var obj = eval("("+tmp+")");
for(var p in obj)
    console.info(obj[p] + ":" + p);

追问

不行吧,还是重新排序了啊

JS对JSON对象遍历输出的时候真的是按照顺序输出吗?

  对象的遍历输出并不是按照对象属性定义顺序来的,那么是按照什么规则来的呢,仔细深入研究你会发现,这还跟浏览器有关系,Chrome跟IE是不一样的,所以给出以下结论:

  Chrome Opera 的 JavaScript 解析引擎遵循的是新版 ECMA-262 第五版规范。因此,使用 for-in 语句遍历对象属性时遍历书序并非属性构建顺序。而 IE6 IE7 IE8 Firefox Safari 的 JavaScript 解析引擎遵循的是较老的 ECMA-262 第三版规范,属性遍历顺序由属性构建的顺序决定。

  Chrome Opera 中使用 for-in 语句遍历对象属性时会遵循一个规律:
它们会先提取所有 key 的 parseFloat 值为非负整数的属性,然后根据数字顺序对属性排序首先遍历出来,然后按照对象定义的顺序遍历余下的所有属性。

那么,解决办法呢?

可以把对象通过Object.keys提取对象的key出来变成数组,然后通过数组的排序,然后遍历数组,通过key去取对象的属性值。

  有一些业务要求对对象的各属性值按照一定顺序排列,而给定的对象属性又不确定能按顺序排列(如,数字大小顺序)

 

//************************* JSON对象属性排序*********************************//
//要求传入参数 JsonData 为JSON对象
//输出结果为JSON对象
//输出的对象为按key值升序排列的
function JsonObjSort(JsonData) { if(JsonData) { var JsonKeyArray=new Array(); for(x in JsonData) { var xToInt=parseInt(x); JsonKeyArray.push(xToInt); } JsonKeyArray=JsonKeyArray.sort();//对数组升序排列 var NewJsonStr="" ; for(var i=0;i<JsonKeyArray.length;i++) { if(i>0) { NewJsonStr += ‘,‘; } var value = JsonData[JsonKeyArray[i]]; NewJsonStr += ‘"‘+JsonKeyArray[i]+ ‘"‘ +‘:‘+value; } var NewJsonStrObj=eval(‘(‘+‘{‘+NewJsonStr+‘}‘+‘)‘); //console.log(NewJsonStrObj); return NewJsonStrObj ; } else return ""; }

 

 

 

 

 

 




以上是关于js遍历json对象顺序问题,使用for in遍历json对象发现排序了,和本来的顺序不一样,有啥解决办法的主要内容,如果未能解决你的问题,请参考以下文章

js 如何遍历对象的属性名,而且按照顺序输出

JS - for in 和 for of 的遍历顺序

JS中的forEach,for in,for of和for的遍历优缺点及区别

对象遍历,多层嵌套数组,for in方法对象遍历,map方法数组遍历

js数组对象的遍历

for in for of区别