Javascript:多维对象

时间:2011-07-10 20:13:38

标签: javascript object multidimensional-array

我想创建一个对象,从以下内容开始:

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函数或预先加载所有类型时都检查类型是否已存在?

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

3 个答案:

答案 0 :(得分:9)

不,没有任何其他方法可以动态创建对象。只检查每次存在:

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

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

答案 1 :(得分:3)

您可以使用布尔OR快捷方式(至少避免显式if)。它可能不那么可读:

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

这是有效的,因为赋值实际上返回已赋值的值,OR表达式返回第一个求值为true的值。

我不认为使用if会对性能产生任何影响(实际上,我的回答方式可能会“慢”)。

答案 2 :(得分:3)

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

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