JSON对象排序被jQuery或Javascript篡改

时间:2012-03-14 07:22:34

标签: javascript jquery json sorting

我返回了以下JSON数据,但由于某种原因,Javascript或jQuery ajax似乎重新组织了项目列表。服务器返回按item.title(已验证)...

按字母顺序排序的数据

下面的JSON是在订购被屠杀之后:

   {
        "count": 3,
        "items": {
            "tardis": {
                "type": 40,
                "title": "Tardis",
                "timeMachine": true,
                "reliable": true
            },
            "stargate": {
                "type": "Milky way gate",
                "title": "Stargate + solar flare",
                "timeMachine": true,
                "reliable": false
            }
        }
    }

有没有人为什么订购被篡改?如何按标题值重新排序项目?

3 个答案:

答案 0 :(得分:5)

您的items对象不是数组,而只是具有命名成员的对象。这些成员没有固有的秩序。

例如,在chrome中执行console.log({ your object })将按照该顺序生成按成员名称排序的属性,在本例中为“stargate”和“tardis”。但是为完全相同的对象写for(k in x.items) console.log(k)(在Chrome中 - 再次,这里没有可靠的规范)按照它们定义的顺序迭代对象,并记录“tardis”,“stargate”。

这种排序是一个如何呈现对象的工件,而不是对象本身。如果要订购,请使用数组:

{
    "count": 3,
    "items": [
        {
            "key": "stargate",
            "type": "Milky way gate",
            "title": "Stargate + solar flare",
            "timeMachine": true,
            "reliable": false
        },
        {
            "key": "tardis",
            "type": 40,
            "title": "Tardis",
            "timeMachine": true,
            "reliable": true
        }
    ]
}

答案 1 :(得分:3)

对象的键不是按照定义的顺序。一旦将它们放入javascript对象中,它们就可以按任何顺序返回。这是语言的设计和指定。

如果您希望它们按特定顺序排列,那么您需要将数据放在一个数组中(这是有序的),或者您需要一个有序索引,只需要能够按所需顺序访问键的键。

数组具有一致的顺序,对象则没有。

在我看来,您可能需要一个如下所示的数据结构:

{
    "count": 3,
    "items": [
        { 
            "name": "tardis",
            "type": 40,
            "title": "Tardis",
            "timeMachine": true,
            "reliable": true
        },
            "name": "stargate",
            "type": "Milky way gate",
            "title": "Stargate + solar flare",
            "timeMachine": true,
            "reliable": false
        }
    ]
}

这样,这些项目就是一个包含特定订单的数组:items[0]items[1]等......

仅供参考,当您这样做时,您不需要"count"值,因为items数组会有items.length

没有计数值,您的整个响应可能只是对象数组:

    [
        { 
            "name": "tardis",
            "type": 40,
            "title": "Tardis",
            "timeMachine": true,
            "reliable": true
        },
            "name": "stargate",
            "type": "Milky way gate",
            "title": "Stargate + solar flare",
            "timeMachine": true,
            "reliable": false
        }
    ]

答案 2 :(得分:1)

如果你在http://www.json.org/阅读JSON规范,你会遇到这一行 -   对象是一组无序的名称/值对

因此,信任对象中键的顺序是不明智的。将其声明为数组,您可以订购。