如何对一个JS对象进行排序?

12

如果我有这个 JS 对象字面量:

var foo = {
    Sussy: 4,
    Billy: 5,
    Jimmy: 2,
    Sally: 1
};

如何创建一个新的、排序过的对象字面量:

var bar = {
    Sally: 1,
    Jimmy: 2,
    Sussy: 4,
    Billy: 5
};

1
你不能像你的问题中展示的那样对JS对象进行排序。这是不可能的。为什么?因为JS对象属性是无序的。改用数组。数组是有序的,而对象则不是。 - Larry K
3个回答

12

关于如何排序 JS 对象的问题:

回答:不行。因此,您需要一个更复杂的数据结构。以下是一些选项:

  1. 您可以使用单独的数组来保存对象键的顺序。(这是 @Felix Kling 答案演示的内容。)优点:通过顺序或名称快速检索。缺点:需要第二个数据结构来保持同步。
  2. 属性不再简单地保存值,而是保存包含值和排序顺序的对象。优点:1 个数据结构。通过属性名快速查找。缺点:按顺序查找慢(需要扫描结构)。排序慢。
  3. 使用数组,其元素由包含键和值的对象组成。优点:1 个数据结构。按顺序快速查找。排序快。缺点:按属性名称查找慢(需要扫描结构)。

我建议使用解决方案3,因为它利用了 JS 机制来管理排序。

示例:

// Object holds sort order:  (Solution 2)
var foo = {
  Suzy: {v: 4, order: 0},
  Billy: {v: 5, order: 1},
  Jimmy: {v: 2, order: 2},
  Sally: {v: 1, order: 3}
};    

// Array holds keys: (Solution 3)
var woof = [
  {k: 'Suzy', v: 4},
  {k: 'Billy', v: 5},
  {k: 'Jimmy', v: 2},
  {k: 'Sally', v: 1}
];

// Sort the woof array by the key names:
woof.sort(function(a, b) {
  return a.k.localeCompare(b.k);
});

// The third key and value:
woof[2].k; // the third key
woof[2].v; // the third value

编辑:已更新代码以修复拼写错误。谢谢,@Martin Fido


感谢您让我走上正确的轨道并提供所有细节。我会尝试第三个方法。 - edt
1
谢谢,我也喜欢第三个。不过请注意,排序好像不起作用。尝试使用woof.sort(function(a, b) { return a.k.localeCompare(b.k); }); - Martin Fido
我从一个JSON结构创建了一个巨大对象文字。我的问题是,我必须在其他属性之间添加嵌套对象的属性。我为它们分配了ID,但这并不好,因为我必须递归地循环遍历所有节点及其子级。你能否建议一种特殊的数据结构?也许将对象引用存储在orderArray中? - philx_x
@philx_x 你应该在 Stack Overflow 上提出你的问题,作为一个新的问题。 - Larry K

8

对象属性没有特定的顺序(顺序取决于实现),您无法对属性进行排序。

您需要保留键的数组并相应地进行排序,例如:

var keys = [];

for(var key in obj) {
    if(obj.hasOwnProperty(key)) {
        keys.push(key);
    }
}

keys.sort(function(a, b) {
    return obj[a] - obj[b];
});

现在,您可以迭代数组的值并使用它们来访问对象的相应属性。

1

事实证明,自从ES2015以来,对象属性的顺序是可预测的。这太神奇了。

在这里查看。


那是否意味着您可以展示如何对对象进行排序? - Scratte
1
这是一个仅包含链接的答案。请提取或解释所需信息并将其添加到答案中。仅包含链接的答案很不受欢迎,因为当链接失效时它们是没有用的。通常情况下,一个答案应该能够独立支撑,而不依赖于外部信息。添加一个展示如何对对象进行排序的代码片段将会对这个答案有很大帮助。 - 3limin4t0r

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接