更简单,现代且当前浏览器支持的方法很简单:
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;
};
var myFlattenedObj = flattenObject(sortMyObj);
JSON.stringify(myFlattenedObj, Object.keys(myFlattenedObj).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}