JSON对象排序被jQuery或Javascript篡改

JSON object ordering being tampered with by jQuery or Javascript

本文关键字:Javascript 篡改 jQuery 对象 排序 JSON      更新时间:2023-09-26

我返回了以下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
            }
        }
    }

有人知道订单被篡改的原因吗?如何按标题值重新订购商品?

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

例如,在chrome中执行console.log({ your object })将产生按成员名称排序的属性,在本例中为"stargate"answers"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
        }
    ]
}

对象的键没有按定义的顺序排列。一旦将它们放入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
        }
    ]

如果您在http://www.json.org/,你会越过这条线的-对象是一组无序的名称/值对

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