[英]Iterating over and comparing properties of two arrays of objects
我已經設置了一個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等。 但是我似乎找不到適當的解決方案。
有什么幫助嗎?
Array.includes()
如果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
-property。 privname
存在,您只需要檢查先前names
-mapped-array中的索引。 對於這種簡單的事情,我使用了三元運算符( ?:
:)。 return value
,它是包含您已更新的對象的數組。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.