【问题标题】:Javascript: multi-dimensional objectJavascript:多维对象
【发布时间】:2011-10-02 08:53:40
【问题描述】:

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

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

重要的是我的 add 函数尽可能快并且地图对象正确,因为我需要在很短的时间内进行大量读写(这是一个动画/游戏应用程序)。

【问题讨论】:

  • 您确定这是性能问题吗?如果我是你,我会先尝试一下,看看它是否有问题。归根结底,要么您需要进行检查,要么需要 javascript 引擎,因此无论如何都需要处理指令
  • 这个链接有你的问题的答案stackoverflow.com/questions/7744611/…

标签: javascript object multidimensional-array


【解决方案1】:

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

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

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

【讨论】:

  • 感谢所有答案,这个最清楚。然后我会选择预加载类型。
【解决方案2】:

您可以使用布尔或快捷方式(至少可以避免显式的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;
    }
    

    【讨论】:

      猜你喜欢
      • 2014-06-23
      • 2019-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-23
      • 2021-06-25
      • 2012-01-28
      • 2012-10-07
      相关资源
      最近更新 更多