对包含对象的JSON对象进行排序

Sorting a JSON object containing objects

本文关键字:对象 排序 包含 JSON      更新时间:2023-09-26

我有一个json对象,对象如下:

{
    "166":
        {
            "name":{"name":"name","val":"matt","order":""},
            "props":{"name":"props","val":"1","order":""}
        },
    "147":
        {
            "name":{"name":"name","val":"chris","order":""},
            "props":{"name":"props","val":"4","order":""}
        }
}

在JavaScript中,如何根据props对象中的val属性对该对象进行排序?

这应该会让您接近您想要的。它并不漂亮,但应该会给你指明正确的方向。

var json = 
{
    "166":
    {
        "name":
        {
            "name":"name",
            "val":"matt",
            "order":""
        },
        "props":
        {
            "name":"props",
            "val":"1","order":""
        }
    },
    "147":
    {
        "name":
        {
            "name":"name",
            "val":"chris",
            "order":""
        },
        "props":
        {
            "name":"props",
            "val":"4",
            "order":""
        }
    }
};
var arr = [];
for (var jsonProperty in json) {
    if (json.hasOwnProperty(jsonProperty)) {
        var propVal = json[jsonProperty]['props']['val'];
        arr.push({val: propVal, obj: json[jsonProperty]});
    }
}
var sortedArray = arr.sort(function(a,b){return a.val-b.val});

正如许多评论中提到的,您不会对对象进行"排序"。排序意味着顺序,意味着集合,意味着数据结构。

所以首先,你们需要一个对象数组。因此,通过对键进行迭代,将它们提取到一个数组中。然后将Array.sort与自定义比较器一起使用。

var objectsToSort = {
    "166":
        {
            "name":{"name":"name","val":"matt","order":""},
            "props":{"name":"props","val":"1","order":""}
        },
    "147":
        {
            "name":{"name":"name","val":"chris","order":""},
            "props":{"name":"props","val":"4","order":""}
        }
}
var objects = Object.keys(objectsToSort).map(function (key) {
    return objectsToSort[key];
});
objects.sort(function (a, b) {
    return a.val - b.val;
});

我注意到val是一个数字的字符串表示。如果您想要数字排序,请将它们更改为纯整数,或者将上面的排序函数更改为使用parseInt:

objects.sort(function (a, b) {
    return parseInt(a.val, 10) - parseInt(b.val, 10);
});

我更喜欢更改实际数据而不是函数,因为每次比较和排序通常会运行两次解析N*log(N)。因此它将运行2(N*log(N))。