我已经设置了一个HBS帮助程序,它接受两个对象数组(用户权限)。我想要做的是比较它们并将模板注入用户所做和不具备的特权。
目前,我可以使用以下代码比较权限名称:
hbs.registerHelper('selected', function(option, value){
var i;
var j;
var privName;
var userPriv;
var privObj = new Object();
var privArray = [];
for(i in option){
console.log('each ' + JSON.stringify(option[i]));
privName = option[i].privname;
for (y in value){
if(privName == value[y].privname){
userPriv = value[y].privname;
console.log('user has the following privileges', value[y].privname);
privObj = new Object();
privObj.name = userpriv;
privObj.id = value[y]._id;
privObj.state = 'selected';
privArray.push(privObj);
} else if (privName != value[y].privname){
console.log('user doesnt have priv ', privName);
privObj = new Object();
privObj.name = option[i].privname;
privObj.id = option[i].id;
privObj.state = '';
privArray.push(privObj);
}
}
}
console.log('privileges array ', privArray);
return privArray;
});
当用户只有一个权限时,这可以正常工作,但是当用户有多个权限(例如两个权限)时,它会返回两次权限。如果用户有3,三次等等。我知道这是因为数组再次循环,因为它们在.length中是2,3等。但是,我似乎找不到合适的解决方案。
任何帮助?
P.S。如果Array.includes()
方法允许您搜索对象属性,那就太好了。
答案 0 :(得分:1)
以您的方式创建新对象的问题是,对于添加到特权实体的每个属性,您必须返回该函数并设置该属性。您只需添加/更改现有对象的state
属性:
hbs.registerHelper('selected', function(option, value) {
var names = option.map(function(opt) {
return opt.privname;
});
value.forEach(function(val) {
val.state = names.indexOf(val.privname) >= 0 ? 'selected' : '';
});
return value;
});
基本上:
names
被映射为仅具有privnames的数组。您可以使用console.log(names)
。Array.forEach()
函数在这种情况下很有用,因为您只需要迭代value
中的每个对象并设置其state
- 属性。privname
是否存在,您只需要检查上一个names
- 映射数组中的索引。对于这么简单的事情,我使用了三元运算符(?:
)。return value
,这是包含您已更新的对象的数组。