首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌套在Foreach中的Map函数不像预期的那样行为,为什么?

嵌套在Foreach中的Map函数不像预期的那样行为,为什么?
EN

Stack Overflow用户
提问于 2016-06-24 20:58:06
回答 1查看 2.8K关注 0票数 1

本质上,我试图遍历一个角色数组,并将它的相关权限与主列表数组进行比较,并在这个循环中设置布尔值。因此,我想改变我要循环的原始数组,从主列表中添加不存在的值,并为原始值设置一个真键值对,为附加值设置一个假键值对。我可以控制台注销循环中的所有数据,而我编写的代码似乎与我所期望的一样,直到我注销了最后的结果,其中两个嵌套数组都包含上次循环前后的布尔值。在我对地图的理解上一定有一些空白。我还觉得,在不嵌套的情况下,必须有一种更简单的方法来做到这一点(我正在努力学习如何避免或重构)。

示例代码:

代码语言:javascript
复制
 let roles = [];
    let allPerms = [];
    roles.push({
     name: 'role 1',
     label: 'role-label-1',
 permissions: [
    {
    name: 'permission 1',
    label: 'permission-1'
  },
  {
    name: 'permission 2',
    label: 'permission-2'
  }]
},
{
 name: 'role 2',
 label: 'role-label-2',
 permissions: [
    {
    name: 'permission 3',
    label: 'permission-3'
  },
  {
    name: 'permission 4',
    label: 'permission-4'
  }]
});

allPerms.push({
    name: 'permission 1',
    label: 'permission-1'
  },
  {
    name: 'permission 2',
    label: 'permission-2'
  },
  {
    name: 'permission 3',
    label: 'permission-3'
  },
  {
    name: 'permission 4',
    label: 'permission-4'
  });

console.log(roles);
console.log(allPerms);

function setRoles() {
  roles.forEach(function (val, key, array) {
      let selected = _.difference(array[key].permissions, allPerms);
      let mappedPerms = allPerms.map( function(v, k) {
          let name = _.find(selected, function(i) {
              return i.name == v.name;
          });
          if (typeof name != "undefined" && name.name == v.name) {
              v.selected = true;
          } else if (typeof name == "undefined"){
              v.selected = false;
          }
          return v;
      });
      console.log('ROLE '+key);
      console.log(mappedPerms[0].selected);
      console.log(mappedPerms[0].name);
      console.log(mappedPerms[1].selected);
      console.log(mappedPerms[1].name);
      console.log(mappedPerms[2].selected);
      console.log(mappedPerms[2].name);
      console.log(mappedPerms[3].selected);
      console.log(mappedPerms[3].name);
      array[key].permissions = mappedPerms
  });
  return roles;
}

let testRoles = setRoles();
console.log(testRoles);

下面是这个问题的jSFiddle工作示例:https://jsfiddle.net/patrickisgreat/fu3hza1w/1/

预期产出:

代码语言:javascript
复制
[
  {
    "name": "role 1",
    "label": "role-label-1",
    "permissions": [
      {
        "name": "permission 1",
        "label": "permission-1",
        "selected": true
      },
      {
        "name": "permission 2",
        "label": "permission-2",
        "selected": true
      },
      {
        "name": "permission 3",
        "label": "permission-3",
        "selected": false
      },
      {
        "name": "permission 4",
        "label": "permission-4",
        "selected": false
      }
    ]
  },
  {
    "name": "role 2",
    "label": "role-label-2",
    "permissions": [
      {
        "name": "permission 1",
        "label": "permission-1",
        "selected": false
      },
      {
        "name": "permission 2",
        "label": "permission-2",
        "selected": false
      },
      {
        "name": "permission 3",
        "label": "permission-3",
        "selected": true
      },
      {
        "name": "permission 4",
        "label": "permission-4",
        "selected": true
      }
    ]
  }
]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-24 22:33:45

在这里,Array.prototype.some可能对你有用。forEach角色我们在allPerms上映射并重新构建角色的权限。role.permissions.some可用于检查角色的给定权限是否预先存在.

代码语言:javascript
复制
function setRoles() {

  roles.forEach(function (role) {

    role.permissions = allPerms.map(function (perm) {

      return {
        name: perm.name,
        label: perm.label,
        selected: role.permissions.some(function (rolePerm) {
          return rolePerm.name === perm.name
        })
      }
    })
  })
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38022028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档