如何优化JavaScript中嵌套对象的访问成本?

如何优化JavaScript中嵌套对象的访问成本?,javascript,data-structures,Javascript,Data Structures,我试图优化嵌套对象的访问成本。我有以下结构示例: 现在我想访问数据,但问题是我需要继续添加循环,在这些循环中,我得到的每个数据都是嵌套的。这意味着,如果我想访问机架,我需要为循环(如 var jsonObj=[{ 货架:[ { Shelf1:[ { 机架:[ { 机架1:[ { 第1册:价值 } ] }, { 框架2:[ { 第1册:价值 } ] } ] } ] }, { Shelf2:[ { 机架:[ { 机架1:[ { 第1册:价值 } ] }, { 框架2:[ { 第1册:价值 } ]

我试图优化嵌套对象的访问成本。我有以下结构示例:

现在我想访问数据,但问题是我需要继续添加循环,在这些循环中,我得到的每个数据都是嵌套的。这意味着,如果我想访问机架,我需要为循环(如

var jsonObj=[{ 货架:[ { Shelf1:[ { 机架:[ { 机架1:[ { 第1册:价值 } ] }, { 框架2:[ { 第1册:价值 } ] } ] } ] }, { Shelf2:[ { 机架:[ { 机架1:[ { 第1册:价值 } ] }, { 框架2:[ { 第1册:价值 } ] } ] } ] } ] }];
forvar i=0;i您有n本书要显示在UI中。显示n本书需要n次显示操作。不管它们是否在嵌套循环中,显示操作的总数仍然是n。没有可以执行的优化来减少需要执行的显示操作的数量

即使将数据结构扁平化为一个单一的书籍平面阵列,显示操作的数量仍然是n

我试图优化嵌套对象的访问成本

您是指CPU成本、存储成本还是代码复杂性成本?这三者有着完全不同的含义。既然你继续说

我需要不断地添加循环,只要我得到嵌套数据

我假设您对代码复杂性最感兴趣。在这种情况下,考虑下面的更扁平的数据结构,通过使用诸如下划线之类的实用库,可以更容易地循环、过滤、排序、分组和以其他方式处理。
[
    { shelf: 'Shelf1', rack: 'Rack1', book: 'Book1', value: "Value"},       
    { shelf: 'Shelf1', rack: 'Rack2', book: 'Book1', value: "Value"},
    { shelf: 'Shelf2', rack: 'Rack1', book: 'Book1', value: "Value"},
    { shelf: 'Shelf2', rack: 'Rack2', book: 'Book1', value: "Value"}
]
抽象地说,每个Book1:Value项目都有一个书架和一个架子。在建议的数据结构中,此关联由“属于”关系表示,其中它属于一个数组,该数组是名称指定工具架或机架的属性的值。在上述更平坦的结构中,通过将关联作为属性来显式指定关联

使用更平坦的结构,如果出于某种原因,您希望创建一个数据对象,其中键表示工具架,值表示该工具架上的一组对象,请使用下划线,这非常简单

_.groupBy(obj, 'shelf')
因此,在所有其他条件相同的情况下,更平坦的数据结构似乎是一种更灵活的数据表示方式,您可以更轻松地从中派生出所需的其他内容

另一种看待它的方式是,目前为了找到书架、书架和书籍的关系集,需要迭代三个级别的嵌套数组,而在更平坦的结构中,关系更直接地表示


性能,无论是CPU方面还是空间方面,很少会成为选择一种结构而不是另一种结构的理由,除非您正在处理大量数据。否则,性能上的差异很可能以毫秒或微秒或几K的存储空间来衡量。您应该选择一种结构,使您能够以简洁且可证明正确的方式表示算法。如果您打算处理数十万个对象,那么在这种情况下,是的,您需要设计针对时间或空间优化的自定义结构。

您确实存在可测量的性能问题吗?您拥有的是对象数组,而不是JSON。JSON是一种数据格式,如XML或CSV。如果您不知道每个级别的属性名称,那么除了循环之外,您没有什么其他可以做的。但是,您可以使用递归,使代码更简洁。您实际上想要访问什么?一个特定的值由什么决定?所有的价值观?若你们需要所有的东西,那个么循环是完全合适的。@prasad:不。循环所有的数据仍然是开着的。也许只是n对于移动设备的内存来说变得太大了?