跨多个数组迭代 JS 对象 - 性能
Iterating over JS Object across multiple arrays - Performance
所以基本上我在这里要做的是这样的:
假设您有此对象:
{
owner: 'Richard',
time: 141381983181,
type: 'Football',
approved:['Higgs','Rooney','Jake'],
pending:['Richmond','Sarah','Evelyin'],
rejected:['Bilbo','Alice','Marta']
}
现在,我有点需要一个快速函数,它将返回哪个"名称"属于哪个字段。
例如:determineUserLevel('Bilbo',aMeeting) //return rejected.
所以我写了一个:
function determineUserLevel(spec){
var event = spec.event,
user = spec.user;
if(event.owner === user) return 'owner';
for(var i = 0 ; i < event.approved.length; i++){
if(event.approved[i] === user) return 'approved';
}
for(var x = 0; x < event.pending.length; x++){
if(event.pending[x] === user) return 'pending';
}
for(var f = 0; f < event.rejected.length; f++){
if(event.rejected[f] === user) return 'rejected'
}
return 'user';
}
有没有更好的方法?性能明智 ?可维护的明智吗?或者这很扎实?
谢谢。
除非你的数组很大(数千个项目),否则这样的函数对性能的影响可以忽略不计。 相反,您应该针对可靠性和可读性进行优化。
function determineUserLevel(spec){
var event = spec.event,
user = spec.user;
if(event.owner === user) {
return 'owner';
}
if(event.approved.indexOf(user) > -1) {
return 'approved';
}
if(event.pending.indexOf(user) > -1) {
return 'pending';
}
if(event.rejected.indexOf(user) > -1) {
return 'rejected';
}
return 'user';
}
使用 indexOf 而不是循环可以简化代码,并最大程度地减少键入循环条件的可能性。 您还可以将 2 组合在一起以获得更高的可读性。
function determineUserLevel(spec){
var event = spec.event,
user = spec.user;
if(event.owner === user) {
return 'owner';
}
var sets = ['approved','pending','rejected'];
for(var i=0; i<sets.length; i++) {
var set = sets[i];
if(event[set].indexOf(user) > -1) {
return set
}
}
return 'user';
}
这是多么可读是一个判断电话,但它将允许你轻松地扩展到更多的集合,而不必重复自己。
使用对象作为哈希集而不是字符串数组。所以取而代之的是:
approved:['Higgs','Rooney','Jake']
将其更改为:
approved:{'Higgs':true,'Rooney':true,'Jake':true},
现在查找速度非常快:
if (approved[nameToTest]) {
return "approved";
}
显然,所有其他数组属性也是如此。
如果你从一个数组开始,那么把它转换成一个哈希集是相当简单的,比如:
approved = ['Higgs', 'Rooney', 'Jake'];
var approvedObj = approved.reduce(function(curr, next) {
curr[next] = true;
return curr;
}, {});
alert(JSON.stringify(approvedObj));
转换的初始成本是否值得取决于您的收藏有多大以及您需要多久查找一次。
相关文章:
- immutable.js与嵌套映射/对象的比较/相等性能
- 我应该如何将响应数据保存在对象(json)中以获得更好的操作和性能
- Javascript对象中的跨浏览器密钥查找性能
- 设置1400个Raphael.js对象的不透明度动画会影响动画性能
- 在JavaScript中,在对象上装箱每个数字和字符串的性能成本是多少
- Js对象缓存性能
- 对象描述符getter/setter在最近的Chrome/V8版本中的性能
- 对字符串对象调用 .localeCompare 与构造特制的 Intl.Collator 对象之间的性能差异
- 跨多个数组迭代 JS 对象 - 性能
- 函数和对象之间的差异,以及它如何影响性能
- 在MongoDb中将数据存储为对象与数组以提高写入性能
- Javascript 对象与数组性能
- 在 AngularJS 中将对象推送到 $scope.array 与 var x = [ ] 相比时是否存在任何性能问题
- 使用jQuery提高搜索JSON对象的性能
- 与自实例化构造函数相比,使用对象文字是否具有性能优势
- Three.js性能与对象数量有关
- 获取跨域脚本标记的HTML5性能对象
- 正在从集合[性能/最佳实践/问题]中的数组中删除对象
- Javascript对象函数参数性能
- 将参数添加到'自变量'类数组对象,性能测试