什么是在JSON中何时使用包含对象的对象与对象数组的公认约定?

时间:2015-02-18 15:57:47

标签: javascript arrays json object

我目前正在编写GUI,从根本上允许用户编辑/填充/删除许多设置文件,其中设置使用AJAX存储在JSON中。

我对JavaScript的经验有限(我对MATLAB之外的任何事情都没有经验),但我发现自己重构了我的设置结构,因为使用包含更多对象的对象而不是对象数组的语义。在C#中,我会使用KeyValuePair执行此操作,但是JSON结构阻止我做我真正想做的事情,我想知道是否有一个公认的惯例,我现在应该采用JavaScript,而不是而不是做出这些改变,发现我引起的问题比我解决的更多。

样本数据结构与我的许多结构具有相似的要求,它接受任意数量的年份,并且在这些任意数量的事件中,并在这些事件中包含一定数量的值。

这是以前的结构:

{"2013":
    {
    "someEventName":
        {
        "data1":"foo",
        "data2":"bar",
        ...},
    ...},
...}

这是我的理想结构,其中年/事件名称作为类型为Array的类型字符串的键操作:

["2013":
    [
    "someEventName":
        {
        "data1":"foo",
        "data2":"bar",
        ...},
    ...],
...]

据我所知,这将是无效的JSON表示法,所以这是我提出的结构:

[{"Key":"2013",
  "Value":
      [{"Key":"someEventName",
        "Value":
            {
            "data1":"foo",
            "data2":"bar",
            ...}
      },
      ...]
},
...]

我建议的“测试”是否应该是包含对象或对象数组的对象是“我的子结构是否采用固定的,已知数量的对象?”如果是,则设计为包含对象的对象;如果不是,则设计为对象数组。

我需要经常过滤这个结构来查找数据/值,并且我没有设想过利用使用数组带来的索引功能,但是从数组中推送和删除数据比使用数据更加灵活。对象和感觉就像使用包含对象的对象偏离OOP的类模型;另一方面,如果它是一个包含对象的对象,那么通过“Key”查找我的数据的方法看起来都比较简单,而且我并没有设想自己在这些对象上使用Prototype方法,所以谁关心破坏OOP。

回复1 例如,在上一个添加一年的结构中,代码为OBJ["2014"]={};在新结构中它将是OBJ.push({"Key":"2014", "Value":{}});这两种解决方案同样缺乏复杂性。

在这两种情况下,删除同样都是微不足道的。

但是,如果我想操纵一个事件的值,比如使用一个函数,如果我将一个指向该对象的指针传递给该函数并尝试在引用中取代整个对象,它将无法工作:我被迫复制原始事件(使用jQuery或更糟)并将其重新插入父级别。使用“Value”属性,只要我将整个{"Key":"", "Value":""}对象传递给函数,我就可以覆盖整个值元素。在这种情况下,使用对象数组方法是非常清晰的。

我也基于堆栈溢出上的大量其他响应将此更改基于数组,这鼓励使用它们而不是对象。

1 个答案:

答案 0 :(得分:0)

如果您要做的就是迭代对象,那么对象数组会更有意义。如果这些是设置,并且人们将需要查找特定的设置,则原始对象表示法更好。原版允许人们编写像

这样的代码
var foo = settings['2013'][someEventName].data1

虽然从对象数组中获取数据需要通过迭代来找到具有密钥的数据:2013,这取决于列表的长度将导致性能问题。

将新数据推送到对象就像

一样简单
settings['2014'] = {...}

并从对象中删除数据也很简单

delete settings['2014']