当在JSON中使用包含对象的对象与对象数组时,可接受的约定是什么
What is the accepted convention for when to use an object containing objects vs an array of objects in JSON?
我目前正在编写一个GUI,它从根本上允许用户使用AJAX编辑/填充/删除许多设置文件,其中的设置存储在JSON中。
我对JavaScript的经验有限(坦率地说,我对MATLAB之外的任何东西都没有什么经验),但我发现自己正在重组我的设置结构,因为使用包含更多对象而不是对象数组的对象的语义。在C#中,我会使用KeyValuePair来实现这一点,但是JSON结构阻止了我在这里做我真正想做的事情,我想知道是否有一个公认的在JavaScript中实现这一目标的约定,我现在应该采用它,而不是进行这些更改,发现我造成的问题比我解决的问题多。
样本数据结构的要求与我的许多结构类似,它接受任何年份,在这些年份中接受任何数量的事件,在这些事件中接受一组值。
这是以前的结构:
{"2013":
{
"someEventName":
{
"data1":"foo",
"data2":"bar",
...},
...},
...}
这是我的理想结构,其中年份/事件名称作为数组类型的值的字符串类型的键:
["2013":
[
"someEventName":
{
"data1":"foo",
"data2":"bar",
...},
...],
...]
据我所知,这将是无效的JSON表示法,因此这里是我提出的结构:
[{"Key":"2013",
"Value":
[{"Key":"someEventName",
"Value":
{
"data1":"foo",
"data2":"bar",
...}
},
...]
},
...]
我提出的关于某个东西应该是包含对象的对象还是对象数组的"测试"是"我的子结构是否接受固定的、已知数量的对象?"如果是,设计为包含对象的物体;如果没有,则设计为对象数组。
我被要求经常过滤这个结构来查找数据/值,我从来没有想过要利用使用数组带来的索引功能,然而,从数组中推送和删除数据比对对象更灵活,而且使用包含对象的对象会偏离OOP的类模型;另一方面,如果它是一个包含对象的对象,那么通过"Key"查找数据的方法似乎都更简单,而且我不认为自己在这些对象上使用Prototype方法,所以谁在乎打破OOP呢。
响应1例如,在以前的结构中添加一年,代码将是OBJ["2014"]={}
;在新的结构中它将是CCD_ 2;这两种解决方案同样缺乏复杂性。
在这两种情况下,删除都同样微不足道。
然而,如果我想操作一个事件的值,比如说,使用一个函数,如果我将指向该对象的指针传递给该函数,并试图在引用中超采样整个对象,它将不起作用:我被迫复制原始事件(使用jQuery或更糟的方法),并将其重新插入父级。使用"Value"属性,只要我将整个{"Key":"", "Value":""}
对象传递给函数,我就可以随心所欲地覆盖整个Value元素。在这种情况下,对我来说,使用对象数组方法要干净得多。
我对数组的更改也是基于栈溢出上的大量其他响应,这些响应鼓励使用它们而不是对象。
如果您要做的只是迭代对象,那么对象数组更有意义。如果这些是设置,人们需要查找特定的设置,那么原始对象表示法会更好。原件允许人们编写类似的代码
var foo = settings['2013'][someEventName].data1
而从对象数组中获取数据需要对它们进行迭代,以找到关键字为2013的对象,这取决于列表的长度,会导致性能问题。
将新数据推送到对象就像一样简单
settings['2014'] = {...}
从对象中删除数据也是简单的
delete settings['2014']
- ASP.net使对象可点击
- 使用while循环+break是一种可接受的方式;goto;手术的结束
- javascript外部链接文件的可接受数量是多少
- 如何使动态插入的 html 对象可单击
- 如何在Django表单中设置可接受的文件类型'的FileInput小部件
- Meteor模板数据对象可防止javascript事件触发
- 动画的可接受帧速率有多高
- 当在JSON中使用包含对象的对象与对象数组时,可接受的约定是什么
- 如何模仿在只有 Jquery 对象可用时选择 e.target
- 在AngularJS中,一次进行两次调用是一种可接受的方法
- 你能使一个对象“可调用”吗?
- 是否有可接受的跨平台方法在基于触摸的设备上以标准 Web 表单显示数字键盘
- 将单选按钮绑定到复杂对象可防止选中
- Ajax - Spring 发送 javascript 对象并接受为自定义对象.客户端发送的请求在语法上不正确
- Javascript:从给定的两个片段中引用“this”的可接受方式
- 为什么“{foo:function myName(){}}”语法是可接受的
- 限制Sailsjs中可接受的模型属性
- 有什么方法可以使SVG对象可单击吗
- 将属性附加到函数对象是否安全/可接受?
- 将javascript datetime对象转换为highcharts Date可接受的格式.Utc(2014, 0,2