所以基本上我在这里尝试的是:
让我们说你有这个对象:
{
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';
}
有没有更好的方法?表现明智吗?可维护明智吗?或者这是非常可靠的?
感谢。
答案 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是相当简单的,例如:
approved = ['Higgs', 'Rooney', 'Jake'];
var approvedObj = approved.reduce(function(curr, next) {
curr[next] = true;
return curr;
}, {});
alert(JSON.stringify(approvedObj));
&#13;
转型的初始成本是否值得,取决于您的收藏量有多大以及您需要多长时间查看一次。