【问题标题】:JSON object being reordered by JavascriptJSON对象被Javascript重新排序
【发布时间】:2014-05-31 05:26:35
【问题描述】:

我有一个通过 PHP 生成的相当大的 JSON 对象。它从数据库中创建一个 PHP 对象,键是整数,即 1-100。这些键不是按那个顺序排列的,它们是随机顺序的,例如 55、72、5、8、14、32、64 等。然后我使用 json_encode 将对象输出为 JSON。然后我使用 AJAX 调用来获取该 JSON 并将其存储在一个变量中。但是,该变量的 JSON 对象的顺序是 1-100,而不是上面的排序顺序。

有什么想法为什么会这样,我该如何解决?

【问题讨论】:

  • 请通过显示一些代码来改进这个问题。

标签: javascript php ajax json


【解决方案1】:

JSON 对象没有特定的顺序,也不能保证保持你放置东西的顺序。如果你想要一个顺序的键,你应该把它们放在一个保持顺序的数组中。如果您想要一组有序的键/值对,可以使用几种不同的形式。

最简单的方法是只有一个数组,它是一组交替的键值:

var data = ["key1", "value1", "key2", "value2",...]; 

或者,你可以做一个对象数组:

var data = [{key: "key1", data: "value1"}, {key: "key2", data: "value2"}, {...}]

【讨论】:

  • 我的对象最初只是一个索引 (1-100),具有多个值,包括 ID,甚至是一些嵌套的对象/数组。问题是它要求我的代码在 DOM 的元素中存储太多属性。相反,我认为我会将索引设为 id,这样我就可以调用 object[id].name 等。但是,我需要这些信息来生成附加到元素的对象。这就是为什么维持秩序很重要。
  • 其实你原来的问题很有趣。你应该发布一个关于这个的问题。
  • @sharf 你是什么意思它需要元素中的太多属性?我认为没有实际限制。
  • @PatrickGunderson 不,没有限制。问题是按属性搜索和匹配变得乏味,并且认为引用对象来获取所有信息会更好,并且只需要知道 ID。
  • 按属性搜索和匹配很繁琐!您是否考虑过使用任何内置此类功能的帮助库?
【解决方案2】:

对象中的键在技术上没有顺序。您期望它们按特定顺序排列是数据结构中的错误。 JSON 解析器会将数字键解释为数组位置。

这个

{
    55: "foo",
    29: "bar",
    ...
}

在语义上与:

object[55] = "foo"
object[29] = "bar"

这是:

[
    ...
    "bar" //index 29
    ...
    "foo" //index 55
    ...
]

相反,您应该将对象的顺序和标识分开:

[
    {id: 55, content: "foo"},
    {id: 29, content: "bar"},
    ...
]

【讨论】:

  • 最后一部分“使用数组”是重复的。它可以省略,因为前面的例子是一个对象数组。一个不错的选择是教他如何使用Array.sort() 将对象数组按照他想要的任何顺序排列。
  • 对象数组是顺序不确定的集合,而最终数组是有序的。我将进行编辑以明确这一点。
  • Javascript 中的任何数组都是有序的。它是包含键/值对且无序的对象。每个数组都有一个整数索引。
  • 你是对的。在这种情况下,对象的插入顺序将被保留,OP 的 ID 号也将保留。
  • 我认为这可能是我正在寻找的解决方案,但我不知道如何使它工作。我的对象已经在每个对象中都有 id 作为键/值。问题是我循环遍历附加到元素的对象,并且事先需要以正确的顺序处理对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-19
  • 1970-01-01
  • 2011-05-12
  • 2013-07-15
  • 2023-04-06
相关资源
最近更新 更多