迭代并比较两个对象数组

时间:2017-01-31 10:31:07

标签: javascript arrays handlebars.js javascript-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等。但是,我似乎找不到合适的解决方案。

任何帮助?

P.S。如果Array.includes()方法允许您搜索对象属性,那就太好了。

1 个答案:

答案 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,这是包含您已更新的对象的数组。