我已经设置了一个 HBS 帮助程序,它接受两个对象数组(用户权限)。我想要做的是比较它们并将用户拥有和不拥有的权限注入(inject)回模板中。
现在我可以将权限名称与以下代码进行比较:
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 等。但是我似乎找不到合适的解决方案。
有什么帮助吗?
附注如果 Array.includes()
方法允许您搜索对象属性,那就太好了。
最佳答案
按照您的方式创建新对象的问题是,对于添加到特权实体的每个属性,您都必须返回该函数并设置该属性。您可以只添加/更改现有对象的 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
-mapped-array中的索引。对于如此简单的事情,我使用了三元运算符 (?:
)。 - 最后,您
返回值
,它是包含您已更新的对象的数组。
关于javascript - 迭代并比较两个对象数组的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41955258/