跨多个数组迭代 JS 对象 - 性能

Iterating over JS Object across multiple arrays - Performance

本文关键字:对象 性能 JS 迭代 数组      更新时间:2023-09-26

所以基本上我在这里要做的是这样的:

假设您有此对象:

{
 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));

转换的初始成本是否值得取决于您的收藏有多大以及您需要多久查找一次。