簡體   English   中英

迭代並比較兩個對象數組的屬性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM