在这种情况下,我应该使用数组(包含对象)还是对象(包含对象)
JS - In this kind of case, should I use an array (containing objects) or an object (containing objects)
我听到很多关于我们应该如何使用数组的事情,比如用户列表,因为它是快速的,并且有像长度这样的功能是有用的,等等
然而,在我的许多用例中,我觉得对象的对象是一种方法,我想听听你的意见。例如,我的实时应用中有一个用户列表——每当有新用户连接或断开连接时,该列表就必须更新。在这种情况下,你会使用数组还是对象呢?如果使用数组,原因是什么?
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.时的Catchfor..in循环必须选择一些顺序来枚举对象的属性,因为标准允许Javascript引擎自由选择顺序,所以代码的行为可以改变。除非您在不同的Javascript环境中测试代码,否则您的行为可能并不总是明显不同。
要记住的事情
- 避免依赖于以下顺序:如果你打算在你的程序中使用对象,在循环中枚举对象属性。
- 如果在字典中聚合数据,确保聚合操作是顺序不敏感的。
- 使用数组代替字典对象的有序集合。
只是一些帮助你做决定的东西。
- 如何访问对象内部的“categoryIds”字段/键,该对象包含mongodb's `ObjectId(s)`数
- IE8对象当对象包含null值时应出现错误
- 实际的angular js控制器对象包含什么
- RXJS5 - 按每个对象包含的可观察性过滤对象数组
- 如何在Jade编译之前将Javascript对象包含在Jade模板中
- json对象包含php DateTime,如何转换为漂亮的日期字符串
- 如何使JQuery对象包含Dom对象的快照
- 如果对象包含JavaScript中的字母,如何返回该对象
- 对象包含相同的值,但应该't
- 将一个对象包含在另一个对象中
- Mocha,Chai:断言对象包含在对象数组中
- 测试JSON对象包含我期望的属性
- 如何从json对象中提取数据,json对象包含具有不同类型对象的映射
- AngularJS$http发布对象包含数组的奇怪行为
- 我如何通过另一个对象访问一个对象,这个对象包含一个对象,这个对象是我想要访问的对象的属性
- 如何切换映射-发出一个对象包含原始和新的可观察对象
- 在这种情况下,我应该使用数组(包含对象)还是对象(包含对象)
- 如果对象包含在另一个数组中,则从该数组中删除该对象
- 将JSON发送到WebAPI - JSON对象包含一个图像(字节)-得到错误:表达式太长或太复杂而无法编译
- Angular -只有当数组中的对象包含completed:true时才启用按钮