Select from array

Viewed 68

I have an array. How can I get the name of all users whose group contains "confluence-developers"?

const users = [ {
  "name" : "Mako",
  "email" : "mail1@mail.com",
  "admin" : false,
  "profileUpdatable" : false,
  "internalPasswordDisabled" : true,
  "groups" : [ "readers" ]
}, {
  "name" : "Arasy",
  "email" : "mail2@mail.com",
  "admin" : false,
  "profileUpdatable" : false,
  "internalPasswordDisabled" : true,
  "groups" : [ "confluence-users", "readers", "confluence-developers" ]
}, {
  "name" : "Eliza",
  "email" : "mail3@mail.com",
  "admin" : false,
  "profileUpdatable" : false,
  "internalPasswordDisabled" : true,
  "groups" : [ "readers", "confluence-users" ]
}]
4 Answers

Use filter(), then map():

const users = [ {
  "name" : "Mako",
  "email" : "mail1@mail.com",
  "admin" : false,
  "profileUpdatable" : false,
  "internalPasswordDisabled" : true,
  "groups" : [ "readers" ]
}, {
  "name" : "Arasy",
  "email" : "mail2@mail.com",
  "admin" : false,
  "profileUpdatable" : false,
  "internalPasswordDisabled" : true,
  "groups" : [ "confluence-users", "readers", "confluence-developers" ]
}, {
  "name" : "Eliza",
  "email" : "mail3@mail.com",
  "admin" : false,
  "profileUpdatable" : false,
  "internalPasswordDisabled" : true,
  "groups" : [ "readers", "confluence-users" ]
}]

const confluence_user_names = users
  .filter(user => user.groups.includes('confluence-users'))
  .map(user => user.name);

console.log(confluence_user_names);

I hope this can help

const confluence_developers = users.filter(user => user.groups.includes('confluence-developers'))

There a lot of ways you can archive this in javascript with higher order functions, like @connexo mentioned, filter(), then map().

Another option is use reduce() :

const confluence_user_names = users.reduce((names, info) => {
   if(info.groups.includes('confluence-users')) {
     return info.name
   }
}, [])

You could take a single loop with Array#flatMap and look for nested groups.

var data = [{ name: "Mako", email: "mail1@mail.com", admin: false, profileUpdatable: false, internalPasswordDisabled: true, groups: ["readers"] }, { name: "Arasy", email: "mail2@mail.com", admin: false, profileUpdatable: false, internalPasswordDisabled: true, groups: ["confluence-users", "readers", "confluence-developers"] }, { name: "Eliza", email: "mail3@mail.com", admin: false, profileUpdatable: false, internalPasswordDisabled: true, groups: ["readers", "confluence-users"] }],
    group = "confluence-users",
    result = data.flatMap(({ name, groups }) => groups.includes(group) ? name : []);
    
console.log(result);

Related