Reputation: 2324
I have for loop inside for loop... and my array output is nested array [[{...}]]
but I need
[{...}]
Is there any way to make this array without nested array in this case?
Here is my code... I have users and for every user i need to add new array of objects
users = [{
name: "user1"
role: ["admin", "tester", "viewer"]
},{
name: "user2"
role: ["admin", "tester", "viewer"]
}]
userRole: any[]=[];
for (let user of users){
for (let u of user.role){
this.userRole.push({
name: user.name,
role: u
})
}
this.data.push(this.userRole)
}
User can have multiple role, but because of database structure I need in user object send array with object
{ "name": "user1",
"role": [{
"role" : "admin",
"user" : "user1"
},{
"role" : "tester",
"user" : "user1"
},{
"role" : "view",
"user" : "user1"
}]
}
but I get this
{ "name": "user1",
"role": [ // nested array
[{
"role" : "admin",
"user" : "user1"
},{
"role" : "tester",
"user" : "user1"
},{
"role" : "view",
"user" : "user1"
}]
]
}
I try to use .flat()
but still the same
Upvotes: 1
Views: 135
Reputation: 2324
Here is the answer, thnx to user @CodeManiac, he gave me a way of thinking...
I need to push item inside second for-loop
... and now everything works like I expect
for (let user of users){
for (let u of user.role){
this.data.push(name: user.name, role: u)
}
}
Upvotes: 0
Reputation: 364
users = [{
name: "user1",
role: ["admin", "tester", "viewer"],
},{
name: "user2",
role: ["admin", "tester", "viewer"],
}
]
userRole = users.map(user => {
roles = user.role.map(x => {
return {role:x,user:user.name}
})
return {
name: user.name,
role: roles
}
})
console.log(userRole)
Upvotes: 1
Reputation: 37775
You can simply use two map
let users = [{name: "user1",role: ["admin", "tester", "viewer"]}, {name: "user2",role: ["admin", "tester", "viewer"]}]
let final = users.map(({name,role})=>{
return {
name,
role: role.map(user=>({name,user}))
}
})
console.log(final)
To make your code work, all you need is defined two variable one to hold the final value and another one to hold userRole
for particular user,
const users = [{name: "user1",role: ["admin", "tester", "viewer"]}, {name: "user2", role: ["admin", "tester", "viewer"]}]
const final = []
for (let user of users) {
const userRole = [];
for (let u of user.role) {
userRole.push({
name: user.name,
role: u
})
}
final.push({name:user.name, role: userRole})
}
console.log(final)
Upvotes: 3
Reputation: 736
Please use flatMap :
var data = { "name": "user1",
"role": [ // nested array
[{
"role" : "admin",
"user" : "user1"
},{
"role" : "tester",
"user" : "user1"
},{
"role" : "view",
"user" : "user1"
}]
]
};
data.role = data.role.flatMap(data => data);
console.log("print data object");
console.log(data)
Upvotes: 1
Reputation: 23
Why don't you use the "u" in the second for loop, to add your array of roles?
Upvotes: 0
Reputation: 1121
I made some change on your code. Every loop you are creating a new role, I supposed this.data is a array of userRole? So, you can add it every loop on your data array.
for (let user of users){
for (let u of user.role){
const userRole= { name: user.name, role: u};
this.userRole.push(userRole);
this.data.push(userRole)
}
}
Upvotes: 1