排序对象属性和JSON.stringify
我的应用程序包含大量对象,我将它们进行字符串化并将其保存到磁盘。不幸的是,当数组中的对象被操纵并且有时被替换时,对象上的属性以不同的顺序列出(它们的创建顺序?)。当我在数组上执行JSON.stringify()并将其保存时,一个diff显示以不同顺序列出的属性,当尝试使用diff和合并工具进一步合并数据时,这很烦人。
理想情况下,我想在执行字符串化之前或作为字符串化操作的一部分,按字母顺序对对象的属性进行排序。有代码可以在许多地方操作数组对象,而更改它们以始终以显式顺序创建属性将很困难。
建议将是最欢迎的!
一个简洁的例子:
obj = {}; obj.name="X"; obj.os="linux";JSON.stringify(obj);
obj = {}; obj.os="linux"; obj.name="X";
JSON.stringify(obj);
这两个string化调用的输出是不同的,并且显示在我的数据的差异中,但是我的应用程序并不关心属性的顺序。这些对象以多种方式和位置构造。
回答:
更简单,现代且当前受浏览器支持的方法如下:
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.stringify 的全部内容, 来源链接: utcz.com/qa/422932.html