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

JS - In this kind of case, should I use an array (containing objects) or an object (containing objects)

本文关键字:对象 包含 数组 这种情况下 我应该      更新时间:2023-09-26

我听到很多关于我们应该如何使用数组的事情,比如用户列表,因为它是快速的,并且有像长度这样的功能是有用的,等等

然而,在我的许多用例中,我觉得对象的对象是一种方法,我想听听你的意见。例如,我的实时应用中有一个用户列表——每当有新用户连接或断开连接时,该列表就必须更新。在这种情况下,你会使用数组还是对象呢?如果使用数组,原因是什么?

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)函数,它扫描数组并在找到用户时删除用户。

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

也许你想看看这个问题a:在底层,Javascript对象是哈希表吗?

Dictionary style from Direct Instance of Object

在你的简单情况下,我会像你一样使用字典。如果需要,可以使用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.时的Catch

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

要记住的事情

  1. 避免依赖于以下顺序:如果你打算在你的程序中使用对象,在循环中枚举对象属性。
  2. 如果在字典中聚合数据,确保聚合操作是顺序不敏感的。
  3. 使用数组代替字典对象的有序集合。

只是一些帮助你做决定的东西。