动态属性作为关键VS Javascript中的对象列表 - 哪一个会更高效

时间:2017-04-13 16:48:13

标签: javascript arrays dictionary

我需要一个像HashMap(在JAVA中)的数据结构,我希望用户的地图状态使用用户ID作为关键字。因此,我可以轻松地创建地图动态,如下所示: -

var mapOfIdVsStatus = {
  123: "true", 
  456: 'false'
}
alert(JSON.stringify(mapOfIdVsStatus));

在我的方案中,新的用户ID 状态将非常频繁地添加/更新

Object.keys(mapOfIdVsStatus).length; 

会增加。但这有助于以更快的方式搜索用户的状态

我可以用另一种方式做到这一点:

var user1={
    id:123,
    status: true
}
var user2={
    id:456,
    status: false
}

var listOfUser = [];
listOfUser.push(user1);
listOfUser.push(user2);

alert(JSON.stringify(listOfUser));

我还可以在列表中为用户搜索状态,但需要额外的工作,例如循环 ..等等

考虑了很多添加搜索内存优化哪一个是我的最佳选择?

行为就像:

  • 在运行时之前,密钥通常是未知的吗? - 的

  • 您需要动态查找吗? -

  • 所有值都具有相同的类型吗? - 的

  • 它们可以互换使用吗? -

  • 您需要的键不是字符串吗? - Always String

  • 是否经常添加或删除键值对? - 始终添加,不删除

  • 您是否有任意(容易变化)的键值对? -

  • 集合是否已迭代? - 我希望更快地避免迭代 访问。

2 个答案:

答案 0 :(得分:2)

对象,动手。属性查找将是最差,是一种hashmap风格的查找,而不是线性搜索。

如果你这样做,最好在没有原型的情况下创建对象:

var mapOfIdVsStatus = Object.create(null);

...所以它不会从Object.prototype继承属性。

在符合ES2015的JavaScript引擎上,您也可以查看MapMap专门设计为一个简单的键/值映射,因此不受任何对象的影响。在Chrome和Firefox上,至少在我的简单测试中,performs as well or better than object lookup with string keys(这是Chrome; Firefox似乎相似):

enter image description here

...但是object lookup easily outpaces Map with number keys(这也是Chrome,在Firefox上只有两倍的速度,而不是快三倍):

enter image description here

但是,这些测试只会在添加后测试查询值,而不是添加新值的动词。 (您正在谈论的更新并不重要,因为您正在更改存储对象的属性,而不是实际存储的内容,如果我正确读取的话。)

一个非常关键的事情是,如果您需要删除条目,使用对象,您最好将属性的值设置为null或{{ 1}}而不是使用undefined。在对象上使用delete确实可以真正减慢后续操作。

答案 1 :(得分:2)

最好的选择是ES6 Map。 MDN提供了一些提示何时使用它而不是普通对象:

  

如果您仍然不确定使用哪一个,请问自己以下问题:

     
      
  • 在运行时之前,密钥通常是未知的吗?你需要动态查找它们吗?
  •   
  • 所有值都具有相同的类型吗?它们可以互换使用吗?
  •   
  • 您是否需要不是字符串的键?
  •   
  • 是否经常添加或删除键值对?
  •   
  • 您是否有任意(容易变化)的键值对?
  •   
  • 集合是否已迭代?
  •   
     

如果您回答“是”'对于任何这些问题,这表明您可能想要使用Map