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

时间:2015-01-20 15:41:24

标签: javascript

所以基本上我在这里尝试的是:

让我们说你有这个对象:

{
 owner: 'Richard',
 time: 141381983181,
 type: 'Football',
 approved:['Higgs','Rooney','Jake'],
 pending:['Richmond','Sarah','Evelyin'],
 rejected:['Bilbo','Alice','Marta']
}

现在,我需要的是一个快速的功能,可以返回哪个' Name'属于哪个领域。

例如: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';

}

有没有更好的方法?表现明智吗?可维护明智吗?或者这是非常可靠的?

感谢。

2 个答案:

答案 0 :(得分:1)

除非您的阵列很大(数千项),否则这样的功能对性能的影响可以忽略不计。您应该优化可靠性和可读性。

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';

}

它的可读性有点像判断,但它可以让你轻松扩展到更多的集合,而不必重复自己。

答案 1 :(得分:0)

将对象用作哈希集而不是字符串数组。所以不要这样:

approved:['Higgs','Rooney','Jake']

将其更改为:

approved:{'Higgs':true,'Rooney':true,'Jake':true},

现在查找速度非常快:

if (approved[nameToTest]) {
    return "approved";
}

对于所有其他数组属性显然都是一样的。

如果你从一个数组开始,那么将它转换为一个hashset是相当简单的,例如:

&#13;
&#13;
approved = ['Higgs', 'Rooney', 'Jake'];

var approvedObj = approved.reduce(function(curr, next) {
  curr[next] = true;
  return curr;
}, {});

alert(JSON.stringify(approvedObj));
&#13;
&#13;
&#13;

转型的初始成本是否值得,取决于您的收藏量有多大以及您需要多长时间查看一次。