【问题标题】:Sort an Object by Value按值对对象进行排序
【发布时间】:2016-07-15 05:48:23
【问题描述】:

我有一个包含聊天列表的 JS 对象。我需要的是根据 last_message_at 值(这是一个纪元(Unix))按 desc 顺序对它们进行排序。

Object的结构如下

var test = {
    "138545616542461": {
        "otherUser": {
            "$id": "128636544201178",
            "$priority": null,
            "age": 35
        },
        "last_message_at": 1268482500
    },
    "138545616542460": {
        "otherUser": {
            "$id": "128636544201178",
            "$priority": null,
            "age": 35
        },
        "last_message_at": 1368482500
    }
};

通常,排序后的对象应该在顶部有1368482500。数组可用于排序目的,但最终结果应该是一个对象。

尝试了一些 stackoverflow 示例,但没有成功..

【问题讨论】:

  • 如果您希望在对象上对对象的键进行排序,则您使用了错误类型的数据结构。使用数组进行排序,而不是普通对象。
  • 如果需要对象而不是数组,这不是错误的数据类型!该程序使用 test["138545616542460"] 而不是一些循环数组的 test.find("138545616542460") 查找元素的速度要快得多。复杂度从 O(n) 下降到 O(1) !!!

标签: javascript sorting object


【解决方案1】:

有许多重要问题阻碍了您尝试完成的确切步骤,因此我冒昧地采用了一种快速方法来完成我认为您的操作want -- 即枚举对象的键并按last_message_at

numeric值排序
Object.keys(test)
      .sort((a,b) => {
             return test[a].otherUser.last_message_at - test[b].otherUser.last_message_at; })
      .map((elt) => { return test[elt]; });

这个函数返回一个数组(因为它必须)。正如@jfriend00 指出的,Javascript 中永远无法保证对象属性的顺序。

要说明的另一点是,您不能拥有具有重复键的对象——当对象初始化完成时,您提供的 test 对象将只有一个键。

【讨论】:

  • 但是我这样做的时候丢失了密钥
  • 是的,这是完全正确的——你不能有一个带有重复键的对象。
  • 但是key不一样..看key的最后1和0结尾
【解决方案2】:

Javascript 不保证对象中属性的顺序。

从 ECMAScript 中定义对象:

4.3.3 对象

对象是对象类型的成员。这是一个无序的 属性的集合,每个属性都包含一个原始值, 对象或功能。存储在对象属性中的函数是 称为方法。

您应该使用数组或map 对象来保证键顺序。

【讨论】:

    猜你喜欢
    • 2011-11-16
    • 2012-12-24
    • 2021-09-16
    • 2013-02-12
    • 2023-04-03
    • 2021-07-20
    • 2016-09-21
    • 2012-01-17
    • 2014-05-12
    相关资源
    最近更新 更多