I have array name as DATA it contains list of objects of user ,some users have more than one roles , I need to convert the key role to a array and push the other roles of that user into that array , I have written this code but don’t knnow why its not working
try {
let results = await query(`
select
u.UserId,
u.UserName,
u.UserStatus,
u.MobileNumber,
u.Email,
cm.ClientName,
r.RoleId,
r.RoleName,
sm.SystemName
from
\`User\` u
join UserRoleMapping urm on urm.UserId=u.UserId
join Role r on r.RoleId=urm.RoleId
join SystemMaster sm on sm.MasterSystemId=urm.MasterSystemId
join Client_Master cm on cm.ClientMasterId=u.ClientMasterId`);
if (!results) {
return success(res, "No data Found", []);
} else {
let arr = [];
let obj = {};
for (let i of results) {
let user_id = i["UserId"];
let obj1 = {};
if (obj.hasOwnProperty(i["UserId"])) {
obj1["Role"] = [];
obj1["Role"].push(i["RoleName"]);
obj1["System"] = [];
obj1["System"].push(i["SystemName"]);
console.log("inside if")
} else{
obj1["UserName"] = i["UserName"];
obj1["UserId"] = user_id;
obj1["Mobile"] = i["MobileNumber"];
obj1["Email"] = i["Email"];
obj1["UserStatus"] = i["UserStatus"];
obj1["Role"] = [];
obj1["Role"].push(i["RoleName"]);
obj1["System"] = [];
obj1["System"].push(i["SystemName"]);
obj[user_id] = obj1;
}
}
arr.push(obj);
let data = arr.map((user) => {
let keys = Object.keys(user);
let arr1 = [];
for (i of keys) {
arr1.push(user[i]);
}
return arr1;
});
return success(res, "Users fetched successfully", data[0]);
}
Please help solve this
Current Output is this
{
"SUCCESS": true,
"MESSAGE": "Users fetched successfully",
"DATA": [
{
"UserId": 16,
"UserName": "Karan Fulare",
"UserStatus": 1,
"MobileNumber": "9359661324",
"Email": "karan.fulare@greentiger.in",
"ClientName": "GT",
"RoleId": 1,
"RoleName": "Admin",
"SystemName": "Sales" },
{
"UserId": 15,
"UserName": "Venkateswarlu",
"UserStatus": 1,
"MobileNumber": "7893356594",
"Email": "venki@greentiger.in",
"ClientName": "GT",
"RoleId": 10,
"RoleName": "TeleCaller",
"SystemName": "Sales" },
{
"UserId": 16,
"UserName": "Karan Fulare",
"UserStatus": 1,
"MobileNumber": "9359661324",
"Email": "karan.fulare@greentiger.in",
"ClientName": "GT",
"RoleId": 2,
"RoleName": "HRC Manager",
"SystemName": "Admin" }
]
}
And Expected Output is this
{
"UserId": 16,
"UserName": "Karan Fulare",
"UserStatus": 1,
"MobileNumber": "9359661324",
"Email": "karan.fulare@greentiger.in",
"ClientName": "GT",
"RoleId": 2,
"RoleName": ["HRC Manager","Telecaller"]
"SystemName": ["Admin","sales"]
}
>Solution :
It seems like the code is not updating the Role
and System
arrays correctly for the users who have multiple roles. You need to check if the user already exists in the obj
object and if so, you need to update the Role
and System
arrays instead of creating a new object.
try {
let results = await query(`
select
u.UserId,
u.UserName,
u.UserStatus,
u.MobileNumber,
u.Email,
cm.ClientName,
r.RoleId,
r.RoleName,
sm.SystemName
from
\`User\` u
join UserRoleMapping urm on urm.UserId=u.UserId
join Role r on r.RoleId=urm.RoleId
join SystemMaster sm on sm.MasterSystemId=urm.MasterSystemId
join Client_Master cm on cm.ClientMasterId=u.ClientMasterId`);
if (!results) {
return success(res, "No data Found", []);
} else {
let obj = {};
for (let i of results) {
let user_id = i["UserId"];
if (obj.hasOwnProperty(user_id)) {
obj[user_id]["Role"].push(i["RoleName"]);
obj[user_id]["System"].push(i["SystemName"]);
} else {
obj[user_id] = {
"UserName": i["UserName"],
"UserId": user_id,
"Mobile": i["MobileNumber"],
"Email": i["Email"],
"UserStatus": i["UserStatus"],
"Role": [i["RoleName"]],
"System": [i["SystemName"]]
};
}
}
let data = Object.values(obj);
return success(res, "Users fetched successfully", data);
}
} catch (error) {
console.error(error);
return errorResponse(res, error.message);
}