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

标签 javascript arrays handlebars.js javascript-objects

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

相关文章:

javascript - 网站上html、css和js文件的压缩

c++ - 二维阵列中的沟槽

java - 我可以从父类(super class)对象数组中获取子类变量吗?

php - 尝试读取数组上的属性 "title"(错误异常)Laravel Php

javascript - 基于模型类型的 ember 组件

javascript - Ember.js:{{#collection}} 和 {{#each}} 之间的区别?

javascript - 显示可点击的网格

javascript - 如果我不需要 react 性,我应该使用 meteor 吗?

javascript - jQuery UI 图像 slider

ember.js - 在自定义 Handlebars 助手中使用 linkTo