【发布时间】:2014-11-13 02:30:05
【问题描述】:
所以我有一个从我的 JavaScript 应用程序中的 JSON 文件加载的大而简单的对象。
这个文件有大约 9 MB 的数据(不过,一旦我缩小它应该会更低)并且是这样的嵌套结构:
{
"guid": "guid 1 here",
"children": [
{
"guid": "guid 2 here",
"other": "properties",
"here": true,
"children": [
{
"guid": "guid 3 here",
...
},
...
]
},
...
]
}
我不知道这个对象的深度,我需要使用一个通用函数来根据它的 GUID 属性定位一个节点,而不考虑它在树中的深度。这个递归函数(我知道可以使用 while 循环而不是递归进行优化,但不管它很昂贵)很慢。
我想知道是否最初在加载此对象后,我会创建一个这样的缓存结构:
var cache = {
"guid 1 here": [reference to object],
"guid 2 here": [reference to object],
"guid 3 here": [reference to object]
};
我认为这样可以更快地找到对象,因为我只能说
var node = cache[guid];
但是,这实际上最终会提高性能,还是可能导致内存问题?我从未处理过像 cache 这样的变量,其中可能有数十万个属性。
这会帮助还是阻碍这种情况?
一如既往地感谢您的建议,所以,你们太棒了。
【问题讨论】:
-
@EdBayiates:不,数组在这里没用。 guid 不是数组索引,即使它们是数组也会非常稀疏(这不是一个好主意)
-
如果我使用数组,我是否必须遍历每个项目,直到找到具有所需 GUID 的项目?
var result; for (var i = 0; i < cache.length; ++i) { if (cache[i].guid == search_guid) { result = cache[i]; break; } } -
具有属性的对象是一个关联数组。抱歉,您上面的语法正确。所有 JavaScript 对象都在内部存储为数组,这就是 cache[guid] 起作用的原因。我编辑了答案以更新术语。
-
@EdBayiates: …一个没有顺序的关联数组,它留下一个哈希映射。它们是作为数组实现还是(更有可能)不是并不重要。
cache[guid]不是数组语法,它是一个 object 属性访问。 -
是的。这就是您应该使用 varbatim 在不增加大量内存的情况下获得最佳性能的方法。
标签: javascript json caching recursion large-data