我需要一个像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
是否经常添加或删除键值对? - 始终添加,不删除
您是否有任意(容易变化)的键值对? - 是
集合是否已迭代? - 我希望更快地避免迭代 访问。
答案 0 :(得分:2)
对象,动手。属性查找将是最差,是一种hashmap风格的查找,而不是线性搜索。
如果你这样做,最好在没有原型的情况下创建对象:
var mapOfIdVsStatus = Object.create(null);
...所以它不会从Object.prototype
继承属性。
在符合ES2015的JavaScript引擎上,您也可以查看Map
。 Map
专门设计为一个简单的键/值映射,因此不受任何对象的影响。在Chrome和Firefox上,至少在我的简单测试中,performs as well or better than object lookup with string keys(这是Chrome; Firefox似乎相似):
...但是object lookup easily outpaces Map
with number keys(这也是Chrome,在Firefox上只有两倍的速度,而不是快三倍):
但是,这些测试只会在添加后测试查询值,而不是添加新值的动词。 (您正在谈论的更新并不重要,因为您正在更改存储对象的属性,而不是实际存储的内容,如果我正确读取的话。)
一个非常关键的事情是,如果您需要删除条目,使用对象,您最好将属性的值设置为null
或{{ 1}}而不是使用undefined
。在对象上使用delete
确实可以真正减慢后续操作。
答案 1 :(得分:2)
最好的选择是ES6 Map
。 MDN提供了一些提示何时使用它而不是普通对象:
如果您仍然不确定使用哪一个,请问自己以下问题:
- 在运行时之前,密钥通常是未知的吗?你需要动态查找它们吗?
- 所有值都具有相同的类型吗?它们可以互换使用吗?
- 您是否需要不是字符串的键?
- 是否经常添加或删除键值对?
- 您是否有任意(容易变化)的键值对?
- 集合是否已迭代?
如果您回答“是”'对于任何这些问题,这表明您可能想要使用
Map
。