更简单的,现代的和目前的浏览器支持的方法很简单:
JSON.stringify(sortMyObj, Object.keys(sortMyObj).sort());
然而,这种方法确实删除不引用任何嵌套的对象。您将要扁平化排序的对象,以及如果你想是这样的输出:
{"a":{"h":4,"z":3},"b":2,"c":1}
你可以做到这一点与此:
var flattenObject = function(ob) {
var toReturn = {};
for (var i in ob) {
if (!ob.hasOwnProperty(i)) continue;
if ((typeof ob[i]) == 'object') {
var flatObject = flattenObject(ob[i]);
for (var x in flatObject) {
if (!flatObject.hasOwnProperty(x)) continue;
toReturn[i + '.' + x] = flatObject[x];
}
} else {
toReturn[i] = ob[i];
}
}
return toReturn;
};
JSON.stringify(sortMyObj, Object.keys(flattenObject(sortMyObj)).sort());
要的东西你可以调整自己动手编程,您需要将对象属性名称推入数组中,然后按字母顺序对数组进行排序,并遍历该数组(按照正确的顺序),并按顺序从对象中选择每个值。 “hasOwnProperty”也被选中,所以你绝对只有对象自己的属性。这里有一个例子:
var obj = {"a":1,"b":2,"c":3};
function iterateObjectAlphabetically(obj, callback) {
var arr = [],
i;
for (i in obj) {
if (obj.hasOwnProperty(i)) {
arr.push(i);
}
}
arr.sort();
for (i = 0; i < arr.length; i++) {
var key = obj[arr[i]];
//console.log(obj[arr[i]]); //here is the sorted value
//do what you want with the object property
if (callback) {
// callback returns arguments for value, key and original object
callback(obj[arr[i]], arr[i], obj);
}
}
}
iterateObjectAlphabetically(obj, function(val, key, obj) {
//do something here
});
同样,这应该保证你按字母顺序迭代。
最后,以进一步为最简单的方法,该库将递归让您排序任何JSON传递到它:https://www.npmjs.com/package/json-stable-stringify
var stringify = require('json-stable-stringify');
var obj = { c: 8, b: [{z:6,y:5,x:4},7], a: 3 };
console.log(stringify(obj));
输出
{"a":3,"b":[{"x":4,"y":5,"z":6},7],"c":8}
请给你试图字符串化(或者JSON输出或JS对象常量)中的对象 – Bojangles 2013-04-23 10:59:27
对象键不是对象的实例保证有一个固定的订单。这是设计。 – Passerby 2013-04-23 11:07:09
我能想到的唯一跨浏览器方式是修改JSON.stringify实现。 – Dogbert 2013-04-23 11:10:19