当前位置: 首页 > 面试题库 >

排序对象属性和JSON.stringify

周云
2023-03-14
问题内容

我的应用程序包含大量对象,我将它们进行字符串化并将其保存到磁盘。不幸的是,当数组中的对象被操纵并且有时被替换时,对象上的属性以不同的顺序列出(它们的创建顺序?)。当我在数组上执行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}


 类似资料:
  • 问题内容: 如果我有一个JavaScript对象,例如: 有没有一种方法可以基于值对属性进行排序?这样我最终 问题答案: 将它们移动到一个数组,对该数组进行排序,然后将其用于您的目的。这是一个解决方案: 拥有数组后,您可以按自己喜欢的顺序从数组中重建对象,从而完全实现了您打算要做的事情。在我所知道的所有浏览器中都可以使用,但这取决于实现的怪癖,并且可能随时中断。您永远不应假设JavaScript对

  • 我有一个对象列表,我需要按其中一个对象属性对其进行排序。 我可以用下面的代码按升序排序 但是,这是按升序排序列表,而我需要做的是按降序排序。在对对象列表进行排序时,这可能吗?

  • 可能重复: Java两个字段排序问题 我有用户对象,比如 我有一个,其中包含这些对象,我必须按名字对其进行排序,如果名字匹配,则只按姓氏排序。

  • 问题内容: 我已经寻找了一段时间,想要一种对Javascript对象进行排序的方法,如下所示: 并按名称的字母顺序排序以获得: 我找不到任何可以做到这一点的代码。谁能给我些帮助吗? 问题答案: 根据定义,键在对象中的顺序是未定义的 ,因此您可能无法以适应未来发展的方式进行操作。相反,您应该考虑在实际向用户显示对象时对这些键进行排序。无论它在内部使用什么排序顺序都没有关系。 按照惯例,大多数浏览器将

  • 我读过关于使用比较器对数组列表进行排序的文章,但在所有示例中,人们都使用了,根据一些研究,这是一种用于字符串的方法。 我希望按照自定义对象的属性之一对其ArrayList进行排序:日期对象()。通常我会通过来比较它们,所以我想知道我是否可以写出如下内容:

  • 我正在写一个Java的应用程序,它应该读取每行记录的输入文件,字段由逗号分隔。应用程序的输出应在stdout上,格式如下: 等等 我创建了一个类Person来保存数据,并实现了可比接口,该接口对年龄进行主要排序,对性别进行次要排序。我可以稍后在名称上添加三级排序。 接下来,在main方法的App类中,我创建了一个ArrayList,填充了数据,并使用Collections.sort()进行排序。我