动态属性作为键与Javascript中的对象列表-哪一个更有效

动态属性作为键与Javascript中的对象列表-哪一个更有效,javascript,arrays,dictionary,Javascript,Arrays,Dictionary,我需要一个类似HashMap(JAVA)的数据结构,其中我希望使用用户id作为键来映射用户的状态。因此,我可以轻松地动态创建地图,如下所示:- var mapOfIdVsStatus = { 123: "true", 456: 'false' } alert(JSON.stringify(mapOfIdVsStatus)); 在我的场景中,新的用户id和状态将非常频繁地添加/更新 Object.keys(mapOfIdVsStatus).length; 会增加。但这将有助于以更快

我需要一个类似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));
我也可以在列表中搜索用户的状态,但需要额外的努力,如循环..等

考虑到大量的添加搜索内存优化哪一个是我的最佳选择

行为会是这样的:

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

  • 您需要动态查找它们吗?-

  • 所有值的类型是否相同-

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

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

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

  • 您是否有任意数量(易于更改)的键值对?是

  • 集合是否已迭代我希望避免迭代以获得更快的速度 进入


    • 对象,手放下。最坏的情况下,属性查找将是一种hashmap样式的查找,而不是线性搜索

      如果执行此操作,最好在不使用原型的情况下创建对象:

      var mapOfIdVsStatus = Object.create(null);
      
      …因此它不会从
      对象.prototype
      继承属性


      在兼容ES2015的JavaScript引擎上,您还可以查看<代码>映射专门设计为一个简单的键/值映射,因此不受任何对象限制。在Chrome和Firefox上,至少在我的简单测试中,它(这是Chrome;Firefox似乎很相似):

      …但是(这也是Chrome,在Firefox上它的速度只有两倍,而不是不到三倍):

      但是,这些测试只在添加值后测试查询值,而不是添加新值的混乱。(如果我没看错的话,您所说的更新并不重要,因为您正在更改存储对象的属性,而不是实际存储的对象。)


      一个真正关键的问题是,如果需要删除条目,使用对象时最好将属性值设置为
      null
      undefined
      ,而不是使用
      delete
      。在一个对象上使用
      delete
      可以非常、非常慢地对其执行后续操作。

      直接删除对象。最坏的情况下,属性查找将是一种hashmap样式的查找,而不是线性搜索

      如果执行此操作,最好在不使用原型的情况下创建对象:

      var mapOfIdVsStatus = Object.create(null);
      
      …因此它不会从
      对象.prototype
      继承属性


      在兼容ES2015的JavaScript引擎上,您还可以查看<代码>映射专门设计为一个简单的键/值映射,因此不受任何对象限制。在Chrome和Firefox上,至少在我的简单测试中,它(这是Chrome;Firefox似乎很相似):

      …但是(这也是Chrome,在Firefox上它的速度只有两倍,而不是不到三倍):

      但是,这些测试只在添加值后测试查询值,而不是添加新值的混乱。(如果我没看错的话,您所说的更新并不重要,因为您正在更改存储对象的属性,而不是实际存储的对象。)

      一个真正关键的问题是,如果需要删除条目,使用对象时最好将属性值设置为
      null
      undefined
      ,而不是使用
      delete
      。在对象上使用
      delete
      可以非常、非常慢地执行后续操作。

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

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

      • 在运行时之前密钥通常是未知的吗?您需要动态地查找它们吗
      • 所有值的类型是否相同?它们可以互换使用吗
      • 你需要不是字符串的键吗
      • 是否经常添加或删除键值对
      • 您是否有任意数量(易于更改)的键值对
      • 集合是否迭代
      如果您对这些问题中的任何一个回答为“是”,则表明您可能希望使用
      地图

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

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

      • 在运行时之前密钥通常是未知的吗?您需要动态地查找它们吗
      • 所有值的类型是否相同?它们可以互换使用吗
      • 你需要不是字符串的键吗
      • 是否经常添加或删除键值对
      • 您是否有任意数量(易于更改)的键值对
      • 集合是否迭代
      如果您对这些问题中的任何一个回答为“是”,则表明您可能希望使用
      地图


      “你需要不是字符串的键吗?“总是字符串”,然而,你的例子使用的是数字(在你的例子中,数字被转换成字符串,因为你将它们用作对象属性,但是…),这只是个例子。原始用户id是BSON对象的字符串表示形式,如:5349b4ddd2781d08c09890f3“您需要不是字符串的键吗?-始终是字符串”,但您的示例使用数字(在yo中转换为字符串)