如何对对象的JS对象进行排序?

jef*_*ind 6 javascript sorting json jsobject

我在PHP中构建了一个对象,使用了JSON_encode函数并通过ajax将其作为JSON字符串发送到我的JS脚本.然后我将它转换回一个对象.我遇到的问题是我想按照最初创建的顺序保留对象.请将这个对象看成是什么,一旦我进入JS,请看这个图片:

在此输入图像描述

当我创建对象时,它按字母顺序按客户字段排序.以A开头的客户名称将首先出现,B秒等等.正如您所看到的,现在,对象的第一个元素是以S开头的客户.看起来它以某种方式按照顶层的键自动排序对象,这是一个整数,所以我理解为什么会这样.

所以我想做的是重新排序这个对象,以便按customer字母顺序按字段对所有子对象进行排序.这可能吗?如果是这样,我该怎么办?

谢谢!

Fra*_*sta 10

我已经改变了FabricioMatée的答案,变得更加灵活,并返回已排序的对象.

function alphabetical_sort_object_of_objects(data, attr) {
    var arr = [];
    for (var prop in data) {
        if (data.hasOwnProperty(prop)) {
            var obj = {};
            obj[prop] = data[prop];
            obj.tempSortName = data[prop][attr].toLowerCase();
            arr.push(obj);
        }
    }

    arr.sort(function(a, b) {
        var at = a.tempSortName,
            bt = b.tempSortName;
        return at > bt ? 1 : ( at < bt ? -1 : 0 );
    });

    var result = [];
    for (var i=0, l=arr.length; i<l; i++) {
        var obj = arr[i];
        delete obj.tempSortName;
        for (var prop in obj) {
            if (obj.hasOwnProperty(prop)) {
                var id = prop;
            }
        }
        var item = obj[id];
        result.push(item);
    }
    return result;
}
Run Code Online (Sandbox Code Playgroud)

然后只需调用这个函数

your_object = alphabetical_sort_object_of_objects(your_object, 'attribute_to_sort');
Run Code Online (Sandbox Code Playgroud)

  • 一点点增强:在调用 `toLowerCase()` 之前检查数据类型,以防它是一个 `number`。在`obj.tempSortName = data[prop][attr].toLowerCase();` (2认同)

小智 2

这可能是 JavaScript 对象和 JavaScript 数组之间的区别。对象更像是哈希表,其中键不按任何特定顺序排序,而数组是值的线性集合。

在后端,确保您编码的是数组,而不是对象。检查最终编码的 JSON,如果您的对象集合被 {} 而不是 [] 包围,则它被编码为对象而不是数组。

您可能会遇到问题,因为您似乎正在尝试通过 ID 号访问对象,而这就是您希望这些对象在最终数组中占据的索引,这会带来另一个问题,因为您可能不希望当您仅存储少量值时,可以使用包含 40,000 个条目的数组。

如果您只想遍历对象,则应确保编码的是数组而不是对象。如果您想通过特定 ID 访问对象,您可能必须在客户端对对象进行排序(即从 JSON 响应中获取对象,然后创建另一个数组并将这些对象排序到其中,这样您就可以拥有已排序的对象,并且仍然能够通过 id 访问它们)。

您可以通过 Google 轻松找到高效的排序算法(或使用下面来自 ELCas 的算法)。