【问题标题】:Javascript three dimensional arrays vs Object literalJavascript 三维数组与对象文字
【发布时间】:2016-11-08 22:04:57
【问题描述】:

以下两种场景中哪一种表现更好,对语言来说感觉更自然:

  1. 使用对象字面量:

    var object = {
        'key1': [e1, e2, e3, e4, .., en],
        'key2': [e1, e2, e3, e4, .., en],
        'key3': [e1, e2, e3, e4, .., en],
        ...,
        'keyn': [e1, e2, e3, e4, .., en]
    }
    
  2. 使用二维数组(第二维具有唯一的第一个元素)

    var array = [
        ['key1', [e1, e2, e3, e4, .., en],
        ['key2', [e1, e2, e3, e4, .., en],
        ['key3', [e1, e2, e3, e4, .., en],
        ...,
        ['keyn', [e1, e2, e3, e4, .., en]
    ];
    

如果数据结构的主要目的是对 key1、key2、key3、..、keyn 进行纯迭代,并对每个 e1、e2、e3、..、en 执行一些操作。

注意:不确定是否相关,但在初始化期间未按原样定义这两个结构。 object[key] = [e1, ..];array.push([key, [e1, ..]); 在需要迭代和处理之前在整个系统中使用。

编辑: 在整个应用程序中,我需要访问数组 ([e1, e2, .., en]) 以向其推送更多元素。当然,我需要使用字符串键。

所以我猜它有 2 个部分,添加元素并迭代它们。

【问题讨论】:

  • 问题是您是否需要通过字符串键访问元素。数组和哈希表对于不同的任务具有不同的算法复杂性,一般来说,它并不比另一个“更快”或“更自然”。根据您的描述,我会使用数组。
  • 对于已知键的性能明智,我会采用对象版本。如果您需要遍历所有元素,则采用数组版本。
  • @NinaScholz 他们直接表示“数据结构的主要目的是对key1、key2、key3、..、keyn进行纯迭代,并对每个e1、e2、e3、 ..,英文。”。所以他们可能想要使用数组版本,但它们之间的差异很小。这个问题更多地基于意见。
  • 所以如果选择数组版本,则key1...n将成为索引,所以一个简单的二维数组就足够了。
  • 根据您的更新,您需要使用具有数组的对象。

标签: javascript arrays performance multidimensional-array javascript-objects


【解决方案1】:

最好使用对象字面量,因为您不需要初始化更多数组,因此性能可能会更好,但这取决于您做事的方式。

如果你想声明一个数组,你可以在同一个数组中声明所有元素,其中声明了自身名称的元素,所以你跳过第一个索引 (0) 来迭代数组。想法:

var array = [
    ['key1', 1, 2, 3, 4, 9],
    ['key2', 1, 2, 3, 4, 9],
    ['key3', 1, 2, 3, 4, 9],
    ['keyn', 1, 2, 3, 4, 9]
];

for(var i = 0, el; el = array[i]; i ++) {
    for(var b = 1, len = el.length; b < len; b ++) {
        console.log(el[b]);
    }
}

我认为这几乎与声明对象相同,但是数组,除了具有 Object 构造函数外,它们还有 Array 构造函数,然后我“相信”执行器会比声明更慢一个对象字面量。

【讨论】:

    【解决方案2】:

    在这种情况下,Array 会稍微快一些,但不会达到任何明显的程度,对它们中的每一个进行迭代基本上是相同的。

    数组迭代

    for(var i in array){//i is the index of the array
      keyName = array[i][0];
      arrayOfValues = array[i][1];
    }

    对象迭代

    for(var i in object){//i is the keyname
      key = i;
      arrayOfValues = object[i];
    }

    但是,如果您使用 keyid 查找并附加到内部数组,我会使用该对象。

    通过keyid在数组中查找

    var keyId = "key123456";
    var arrayOfValues=null;
    for(var i in array){
      if(array[i][0] == keyId){
        arrayOfValues = array[i][1];
        break;
      }
    }

    在对象中通过keyid查找

    var keyId = "key123456"
    var arrayOfValues = object[keyId]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-07
      • 2016-12-09
      • 1970-01-01
      • 2018-08-09
      • 2013-01-02
      • 2010-10-04
      • 2017-03-14
      • 2022-01-14
      相关资源
      最近更新 更多