gpt4 book ai didi

javascript - 迭代并比较两个对象数组的属性

转载 作者:行者123 更新时间:2023-12-03 05:07:44 25 4
gpt4 key购买 nike

我已经设置了一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com