【问题标题】:JavaScript - How to loop through array of objectsJavaScript - 如何遍历对象数组
【发布时间】:2020-12-05 16:55:39
【问题描述】:

我一直在研究 keycloak admin rest api 方法,并且我得到了大部分方法。我能够使用在 nodejs 中读取的 excel 表创建用户和创建角色,并且效果很好。我能够列出所有用户并列出所有创建的角色。现在我要做的是检查角色是否存在于使用逗号分隔的 excel 文件中,然后只为该用户分配 excel 文件中的角色方法

我将分享我的代码

函数读取用户和角色

let userRoleTobCreated = ReadFromExcel('./uploads/employees-roles.xlsx');
function ReadFromExcel() {
    let userRoleTobCreated = []
    xlsxFile(filename).then((rows) => {
        rows.forEach(row => {
            let userObject = {
                username: row[0],
                lastName: row[1],
                firstName: row[2],
                email: row[3],
                roles: row[4].split(",")
            }
            userRoleTobCreated.push(userObject);
        });
    })
    return userRoleTobCreated;
}

输出

在这里,我想检查员工的 excel 文件,并根据列中的角色,我想为每个用户分配每个角色,但它不起作用,它只为前四个用户分配四个角色

函数调用

GetUser(userid, kc_accessToken).then((resp) => {
 userid = resp.data.map(userRoleTobCreated => userRoleTobCreated.id);

  GetRole(roleId, roleName, kc_accessToken).then((resp) => {
   roleId = resp.data.map(userRoleTobCreated => userRoleTobCreated.id);
   roleName = resp.data.map(userRoleTobCreated => userRoleTobCreated.name);

// Call Api to loop through each customer and assign each role to each customer
// this method just loops through the four role and assign it to the first four users only

      for (var i = 0; i < userid.length; i++) {
      AssignRole(userid[i], roleId[i], roleName[i], kc_clientUUID, kc_accessToken).then((resp) => {
                    })
                }
            })
        })

输出 - 每个用户的角色不是指定 excel 文件的方式

【问题讨论】:

    标签: javascript node.js arrays loops keycloak


    【解决方案1】:

    从 Keycloak 响应中,除了user ID,您还需要它的username,为什么?因为有了username,您就可以匹配从Excel 中检索到的username

    GetUser(userid, kc_accessToken).then((resp) => {
     ...
     usernames = resp.data.map(userRoleTobCreated => userRoleTobCreated.username);
    

    现在您有了用户的IDsusernames,分别用于在 Keycloak 上创建角色并匹配 Excel 内容。

    然后您必须从数组usernames 中获取username,在userRoleTobCreated 中搜索该username,并获取它的roles。然后,您将这些角色添加到用户。为此,首先您必须使用从 Excel 中提取的 role name,并在您的 roleName 数组中获取其对应的索引。您将使用该索引从数组roleId 中获取role ID。代码类似于:

    // For each userID retrieved from Keycloak
    for (var i = 0; i < userid.length; i++) {
        roles = []
        // Find the username and get its roles
        for (var j = 0; j < userRoleTobCreated.length; j++)
            if(usernames[i] == userRoleTobCreated[j].username){
               roles = userRoleTobCreated[j].roles
               break;  
            }
    
        // add each one of the roles
        for(var r = 0; r < roles.length; r++){
           role_pos = roleName.indexOf(role[r])
           role_id = roleId[role_pos]
           AssignRole(userid[i], role_id, role[r], kc_clientUUID, kc_accessToken)...
        }
    };
    

    现在请记住,我不了解 JavaScript、Node.js 等。所以这个伪代码可能需要一些修改,可能在更好的习惯用法和性能方面。不过,算法就在那里。

    我还将您的一些变量 useridroleIdroleName 分别重命名为 userIDsroleIDsroleNames。原始名称使代码有点难以理解,而且还具有误导性。

    【讨论】:

    • 您真是太好了,再次感谢您。干杯
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    相关资源
    最近更新 更多