javascript 我想分组所有的复选框与单一的标题一样,第二个图像

svdrlsy4  于 2022-11-20  发布在  Java
关注(0)|答案(2)|浏览(112)

我从后端获取所有信息并将其Map为对象,我想显示此像分组一样完全像第二个图像,同时获取数据,我得到的对象有权限,并有displayName(读取所有,读取,创建,更新)和组(管理代理等)我想显示管理代理名称只一次,这是显示多次。
下面是从后端获取的后端数据:
{id:54,名称:“agent_read_all”,说明:空,显示名称:“读取全部”,组:“管理-代理”,...}
{id:55,名称:“agent_read”,说明:“取单条记录”,displayName:“已读”,...}
{id:56,名称:“代理创建”,说明:空,显示名称:“创建”,组:“管理-代理”,...}
{id:57,名称:“代理更新”,说明:空,显示名称:“更新”,组:“管理-代理”,...}
{id:62,名称:“候选人_上传_批处理_读取_全部”,说明:空,显示名称:“全部读取”,...}

第二张图像

代码如下:
第一个

n53p2ov0

n53p2ov01#

您可以按group对数据进行分组。

const dataByGroup = data.reduce((groupedData, item) => {
  const groupName = item.group ?? "nogroup";
  if (!(groupName in groupedData)) groupedData[groupName] = [];
  groupedData[groupName].push(item);
  return groupedData;
}, {});

从而产生一个对象,该对象以组名作为键,以权限作为值。

{
  "Admin - Agent": [
    {
      "id": 54,
      "name": "agent_read_all",
      "description": null,
      "displayName": "Read all",
      "group": "Admin - Agent"
    },
    {
      "id": 55,
      "name": "agent_read",
      "description": "Fetch single record",
      "displayName": "Read",
      "group": "Admin - Agent"
    },
    {
      "id": 57,
      "name": "agent_update",
      "description": null,
      "displayName": "Update",
      "group": "Admin - Agent"
    }
  ],
  "nogroup": [
    {
      "id": 56,
      "name": "agent_create",
      "description": null,
      "displayName": "Create"
    },
    {
      "id": 62,
      "name": "candidate_upload_batch_read_all",
      "description": null,
      "displayName": "Read all"
    }
  ]
}

然后,为了进行呈现,您可以Map所有分组对象并获取所有组名,然后再次Map该组中的所有权限。

<b>Permissions Section</b>
{
  Object.entries(([groupName, permissions]) => (
    <List style={{ display: "flex" }}>
      <p>{groupName}</p>
      {permissions.map((permission) => (
        <FormGroup>
          <FormControlLabel
            control={
              <Checkbox
                checked={uroleData.permissions[index] ? true : false} // the index will not be the same since the data is grouped
                value={roleData.permissionId}
                onChange={(e) => {
                  if (e.target.checked) {
                    checkedp.push(permission.id);
                    setRoleData({ ...roleData, permissionId: checkedp });
                  } else {
                    roleData.permissionId.splice(
                      checkedp.indexOf(e.target.value),
                      1
                    );
                  }
                  // console.log(roleData);
                }}
              />
            }
            label={permission.displayName}
          />
        </FormGroup>
      ))}
    </List>
  ));
}
2lpgd968

2lpgd9682#

我希望这段代码能有所帮助,你可以根据自己的需要优化它

const array = [
  { id: 1, displayName: "Create", group: "admin" },
  { id: 2, displayName: "Update", group: "admin" },
  { id: 3, displayName: "Delete", group: "admin" },
  { id: 4, displayName: "all", group: "admin" },
  { id: 11, displayName: "Create", group: "agent" },
  { id: 12, displayName: "Update", group: "agent" },
  { id: 13, displayName: "Delete", group: "agent" },
  { id: 14, displayName: "all", group: "agent" }
];

const dict = {};

for (const item of array) {
  if (item.group in dict) {
    dict[item.group].push({
      displayName: item.displayName,
      id: item.id
    });
  } else {
    dict[item.group] = [
      {
        displayName: item.displayName,
        id: item.id
      }
    ];
  }
}

console.log("dict", dict);

// if you need an array
const list = []

for (const key in dict) {
  list.push({
    group: key,
    items: dict[key] 
  })
}

console.log('list', list)

如果组文本不可靠,您可以检查是否可以传递组ID

相关问题