2011-07-10 61 views
8

我想创建一个对象,从像开始:的Javascript:多维对象

var map = {}; 

然后,我想利用这个功能添加项目:

add = function(integerA, objectB) { 
    map[objectB.type][integerA] = objectB; 
} 

所以,这是我想实现的对象结构的一个随机示例:

map = { 
    'SomeType' : { 0 : 'obj', 2 : 'obj', 3 : 'obj' }, 
    'OtherType' : { 0 : 'obj', 5 : 'obj' }, 
}; 

现在,我的问题。我不能做map[objectB.type][integerA] = objectB;,因为map[objectB.type]没有定义。我可以通过if语句检查map[objectB.type]是否存在并在必要时创建map[objectB.type] = {};来解决此问题。

否则,我可以预加载所有对象类型。不过,我宁愿不必这样做。

我的问题:有没有办法可以创建对象,而不必检查每次我想调用add函数时是否已经存在类型或预加载所有类型?

重要的是我的添加功能是如此之快以及地图对象是正确的,因为我需要在很短的时间内读取和写入很多东西(这是一个动画/游戏应用程序)。

+1

你确定它会是一个性能问题吗?如果我是你,我会先尝试一下,看看它是否有问题。在一天结束时,无论你需要做检查,或JavaScript引擎,所以说明将需要处理 –

+0

这个链接有你的问题的答案 http://stackoverflow.com/questions/7744611/pass-variables-by-reference-in-javascript –

回答

9

不,没有任何其他方式可以随时创建对象。每次只检查是否存在:

add = function(integerA, objectB) { 
    if (!map[objectB.type]) { 
     map[objectB.type] = {};   
    } 
    map[objectB.type][integerA] = objectB; 
} 

如果你想提高性能,你可以考虑一些缓存技术。

+0

我很欣赏所有的答案,这个是最清楚的。我会选择预加载类型。 – user8363

3

您可以使用布尔OR快捷方式(至少避免明确的if)。它可能不是可读,但:

var data = map[objectB.type] || (map[objectB.type] = {}); 
data[integerA] = objectB; 

这工作,因为工作分配实际返回分配的价值和OR表达式返回结果为true第一个值。

我不认为使用if对性能有任何影响,但实际上,我的答案中的方式甚至可能会变得更慢。

3

如果您仅将地图用于查找,并且您不需要遍历维度,则可以将维度合并为单个密钥。例如:

add = function(integerA, objectB) { 
    var key = objectB.type + '-' + integerA; 
    map[key] = objectB; 
}