JS - 在这种情况下,我应该使用数组(包含对象)还是对象(包含对象)

时间:2015-09-22 18:21:27

标签: javascript arrays

我听到很多关于如何将数组用于用户列表之类的内容,因为它很快,并且有长度等功能可以用来等。

然而,在我的许多用例中,我觉得物体的物体是要走的路,我喜欢你的意见。例如,我的实时应用程序中有一个用户列表 - 无论何时新用户连接或断开连接,都必须更新列表。在这种情况下你会使用这样的数组或obj吗?如果使用数组,原因是什么?

var obj = {
    "1": {id:1, fullName: 'My Name', sex: 'male'},
    "50": {id:50, fullName: 'My Name', sex: 'none'},
    "5": {id:5, fullName: 'My Name', sex: 'female'},
};

当用户加入时我只需将他的obj添加到obj,当用户光盘时,我只使用delete obj [50];

如果我使用了数组,我会有一个removeUser(id)函数,它会扫描数组并在找到它时删除用户。

2 个答案:

答案 0 :(得分:0)

最后,您应该使用对象。虽然不能保证它们不受哈希表的支持,但至少它们应该始终优化,以便比搜索数组中的对象(即Array.prototype.filter)更快地访问属性。

也许你想看看这个Q& A:Under the hood, are Javascript objects hash tables?

答案 1 :(得分:0)

来自对象的直接实例的字典样式

在你的简单案例中,我会使用字典作为你拥有的字典。如果需要,可以使用 for in循环枚举属性。如:

var dict = { james: 34, ben: 34, chris: 73};
var people = [];

for (var name in dict){
    people.push(name + ": " + dict[name]);
} 

people; //["alice:34", "bob: 24", "chris: 62"]

首选数组到有序集合的字典

如果你需要一个有序的集合,我更喜欢一个数组。直觉上,Javascript对象是无序的属性集合。获取和设置不同的属性应该以任何顺序工作。 ECMAScript标准未指定属性存储的顺序。

使用时的捕捉......中

for..in循环必须选择一些函数来枚举对象的属性,因为标准允许Javascript引擎自由选择一个顺序,代码的行为可以改变。除非您在不同的Javascript环境中测试代码,否则您的行为可能并不总是显而易见。

要记住的事情

  1. 如果要为程序使用对象,请避免依赖于... in循环枚举对象属性的顺序。
  2. 如果您在字典中汇总数据,请确保汇总操作是顺序不安全的。
  3. 对有序集合使用数组而不是字典对象。
  4. 只是帮助你做出决定的一些事情。