11

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

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

如何创建一个新的排序对象文字:

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

3 回答 3

12

Re: 如何对 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

于 2011-06-07T15:49:06.057 回答
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];
});

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

于 2011-06-07T15:17:23.037 回答
1

事实证明,自 ES2015 以来对象属性顺序是可预测的。这是惊人的。

在这里查看。

于 2020-11-25T22:23:28.723 回答