排序对象属性和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);

这两个stringify调用的输出是不同的,并显示在我的数据的差异,但我的应用程序不关心属性的顺序..对象的构造方式和地点很多..


简单,现代和目前浏览器支持的方法就是这样:

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一代(听起来像你),那么出于你的目的,这可能是一个很好的解决方案:json-stable-stringify

从项目网站:

使用自定义排序确定性JSON.stringify()以从字符串化结果中获取确定性散列

如果生成的JSON是确定性的,您应该能够轻松地对其进行比较/合并。


您可以传递属性名称的排序数组作为JSON.stringify()的第二个参数:

JSON.stringify(obj, Object.keys(obj).sort())
链接地址: http://www.djcxy.com/p/40663.html

上一篇: sort object properties and JSON.stringify

下一篇: What do the following phrases mean in C++: zero