JavaScript:多维对象

8
我想创建一个对象,从类似以下内容开始:
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引擎需要进行处理,因此指令总是需要被处理的。 - Ant Kutschera
这个链接有你问题的答案https://dev59.com/RWsz5IYBdhLWcg3wpZvy - Dark Prince
3个回答

9

没有其他方法可以动态创建对象。每次都只能检查是否存在:

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

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


我感谢所有的回答,这个最清晰易懂。我会选择预加载类型。 - user8363

4
您可以使用布尔 OR 快捷方式(避免至少一个显式的 if)。虽然它可能不太易读:
var data = map[objectB.type] || (map[objectB.type] = {});
data[integerA] = objectB;

这个方法能够起作用是因为赋值操作实际上会返回被赋的值,而或表达式会返回第一个结果为true的值。

我认为使用if对性能没有影响(实际上,我的回答方式可能会更“慢”)。


3

如果您仅使用地图进行查找,并且不需要迭代维度,则可以将维度合并为单个键。例如:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接