如何对 JS 对象文本进行排序?

发布于 2024-11-14 07:24:00 字数 240 浏览 2 评论 0原文

如果我有这个 JS 对象文字:

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

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

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

If I have this JS object literal:

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

How can I create a new, sorted object literal:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

双手揣兜 2024-11-21 07:24:00

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

Re: How to sort a JS Object?

Answer: You can't. So instead, you need a more sophisticated data structure. You have many options:

  1. You can use a separate array to hold the order of the object's keys. (This is what @Felix Kling's answer demonstrates.) Good: fast retrieval via order or name. Bad: needs a second data structure that must be kept synched with the first.
  2. Instead of the Object simply holding properties and values, the properties could hold Objects which hold the values and a sort order. Good: 1 data structure. Fast lookup by property name. Bad: slow lookup by order (need to scan the structure). Slow sorting.
  3. Use an array, with elements consisting of Objects that hold the key and the value. Good: 1 data structure. Fast lookup by order. Fast sorting. Bad: slow lookup by property name (need to scan the structure).

I recommend solution 3 since it uses the JS mechanics to manage the ordering.

Examples:

// 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

Edited: updated code to fix typo. Thank you, @Martin Fido

春风十里 2024-11-21 07:24:00

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

您必须保留一个键数组并对其进行相应的排序,例如:

var keys = [];

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

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

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

Object properties are in no specific order (the order is implementation dependent) and you cannot sort the properties.

You have to keep an array of keys and sort it accordingly, for example:

var keys = [];

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

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

Now you can iterate over the values of the array and use them to access the corresponding property of the object.

秋风の叶未落 2024-11-21 07:24:00

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

看看在这里。

Turns out object property order is predictable since ES2015. Which is amazing.

Check it out here.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文