【问题标题】:Sorting the properties of the object对对象的属性进行排序
【发布时间】:2012-04-26 11:06:39
【问题描述】:

我的 json 对象如下所示:

events:{
"2": {
    "action": "some value",
    "property": "some value"
}
"0": {
    "action": "some value",
    "property": "some value"
}
"1": {
    "action": "some value",
    "property": "some value"
}

}

我需要对对象的属性进行排序。有没有办法做到这一点?结果应该是这样的:

events:{
"0": {
    "action": "some value",
    "property": "some value"
}
"1": {
    "action": "some value",
    "property": "some value"
}
"2": {
    "action": "some value",
    "property": "some value"
}

}

【问题讨论】:

  • 在对象中,order is not guaranteed。而是将它们存储在数组中。
  • @Joseph — 这应该是一个答案。 :)
  • @Srikanth Kshatriy — 这是一个对象文字,而不是 JSON。 JSON 是一种数据序列化格式。
  • 这看起来很适合 XY 问题:mywiki.wooledge.org/XyProblem。你真正想做什么?
  • @joeframbach 是的.. 看起来像一个 XY 问题,但只是在寻找 X 的解决方案 :)

标签: javascript sorting javascript-objects


【解决方案1】:

为了保证顺序,就像@Joseph 说的那样,它需要在一个数组中:

var events = {
  "2": {
    "action": "some value",
    "property": "some value"
  },
  "0": {
    "action": "some value",
    "property": "some value"
  },
  "1": {
    "action": "some value",
    "property": "some value"
  }
};

var eventOrder = [];

for( var prop in events ){
  if( events.hasOwnProperty( prop ) ){
    eventOrder.push( prop );
  }
}

eventOrder.sort();

注意:由于您使用的是字符串,因此这将按字母顺序排序,因此如果您有超过 9 个项目,您最终可能会得到 eventOrder 为 [ "1", "10", "2", 。 ...]。如果不希望这样做,您可以在存储到数组之前先解析 Int,然后在进行查找时强制字符串。

【讨论】:

  • 这最适合我的要求。谢谢@webnesto
  • 以后不需要“强制”一个字符串,alert(events[2]) 可以正常工作。
  • @RobG - 从技术上讲,您是正确的,但您当时依赖于 JS 类型转换。这与使用“==”进行评估是一样的,如果您在参数的“===”一侧出现,那么您还需要确保您使用字符串进行哈希查找。
  • 大多数在 javascript 中进行类型转换而不考虑它,这是可以使用的语言的一个特性。有人做obj[String(a)]obj[String(fn())] 甚至String(a) + String(b) 吗? FWIW 我只在需要的地方使用===,这并不常见。
【解决方案2】:

结合我的评论,以这种方式存储它:使用数组,然后将这些索引存储为 id。然后你可以使用一些排序算法来移动它们。这里'是some samples of sorting algorithms你可能想看看

events:[
    {
        "id" : 2,
        "action": "some value",
        "property": "some value"
    },
    {
        "id" : 0,
        "action": "some value",
        "property": "some value"
    },
    {
        "id" : 1,
        "action": "some value",
        "property": "some value"
    }
]

【讨论】:

  • 我通常更喜欢将订单和数据存储为单独的元素 - { events: { "foo" : { "id" : "foo", ... } }, eventOrder: [ "foo", ... ] }
猜你喜欢
  • 2015-06-20
  • 1970-01-01
  • 2016-02-08
  • 1970-01-01
  • 2011-03-21
  • 2013-02-12
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多