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 "";
}
上一篇:Windows平台软件推荐:神器小工具(骨灰级)


下一篇:乐在其中设计模式(C#) - 享元模式(Flyweight Pattern)