我正在尝试优化嵌套对象的访问成本。我有以下结构(例子):
现在我想访问数据,但问题是我需要继续添加循环,每次我得到嵌套数据。这意味着如果我想访问机架,我需要为
这样的循环迭代3
var jsonObj=[{
"shelfs": [
{
"Shelf1": [
{
"Racks": [
{
"Rack1": [
{
"Book1": "Value"
}
]
},
{
"Rack2": [
{
"Book1": "Value"
}
]
}
]
}
]
},
{
"Shelf2": [
{
"Racks": [
{
"Rack1": [
{
"Book1": "Value"
}
]
},
{
"Rack2": [
{
"Book1": "Value"
}
]
}
]
}
]
}
]
}];
for(var i=0;i<jsonObj.length;i++)
{
var shelfs=jsonObj[i];
var key=Object.keys(shelfs)[0];
//var shelfs=arr[arr[0].key];
//alert(JSON.stringify(shelfs[key]));//shelfs));
for(var j=0;j<shelfs[key].length;j++)
{
var shelfdetails=shelfs[key][j];
var skeys=Object.keys(shelfdetails);
for(var k=0;k<skeys.length;k++)
{
var racks=shelfdetails[skeys[k]];
alert(JSON.stringify(racks));
}
}
}
&#13;
这里访问机架信息我把3个嵌套用于循环,但最终它增加了时间复杂度。任何人都可以建议我使用更好的数据结构或方法来访问时间复杂度较低的嵌套JavaScript对象吗?
答案 0 :(得分:0)
您想要在UI中显示n本书。它将需要n次显示操作来显示n本书。它们在嵌套循环中并不重要,显示操作的总数仍为n。您无法执行任何优化以减少需要执行的显示操作的数量。
即使您要将数据结构展平为单个平面数据库,显示操作的数量仍然是n。
答案 1 :(得分:0)
我正在尝试优化嵌套对象的访问成本。
您的意思是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"
项目都与一个架子和一个架子相关联。在建议的数据结构中,此“关联”由“属于”关系表示,其中它属于一个数组,该数组是名称指定货架或机架的属性的值。在上面更平坦的结构中,通过将它们作为属性明确指定关联。
使用更扁平的结构,如果由于某种原因你想要创建一个数据对象,其中的键给出了架子,而值给出了该架子上的对象数组,在Underscore中就像
一样简单_.groupBy(obj, 'shelf')
所以在其他条件相同的情况下,更平坦的数据结构似乎是一种更灵活的方式来表示数据,您可以更轻松地从中获取所需的其他内容。
另一种看待它的方法是,目前为了找到货架,货架和书籍的关系集,你需要迭代三层嵌套数组,而在更扁平的结构中,关系更直接地表示
无论是在CPU方面还是在空间方面,性能很少是选择一种结构而不是另一种结构的理由,除非您处理大量数据。否则,性能差异可能以毫秒或微秒或几K存储量来衡量。您应该选择允许您以简洁且可证明正确的方式表示算法的结构。如果您打算处理数十万个对象,那么在这种情况下,您可能希望设计针对时间或空间优化的自定义结构。