'searching multiple values in string array in javascript/react

I have many values in string array. ['A','B','C','D','E'].

I have to search like this. if Array contains A ,B then it is admin. if it contains C,E then it is resercher. if it is containing B,C,D then it is manager.

I am writing below code for it. its not working. can you please help me on same.

 const groups = ['A','B','C','D','E']


for (let i = 0; i < groups.length; i++) {
    if (groups[i]==='A'&&  groups[i] ==='B'  ) setAdmin(true);
    if (groups[i]==='C' && groups[i] ==='E'   ) setResearcher(true);
    if (groups[i]==='B' && groups[i] ==='C' && groups[i] ==='D' ) setRiskMgr(true);

}

I know it is not working because it is comparing element with multiple values. How can I resolve this?



Solution 1:[1]

You can use every and includes to utilize your logic

const groups = ['A', 'B', 'C', 'D', 'E']

const userGroups = {
  admin: ['A', 'B'],
  researcher: ['C', 'E'],
  riskManager: ['B', 'C', 'D']
}

function setAdmin() {
  console.log('admin')
}

function setResearcher() {
  console.log('researcher')
}

function setRiskMgr() {
  console.log('risk manager')
}


if (userGroups.admin.every(group => groups.includes(group))) setAdmin(true);
if (userGroups.researcher.every(group => groups.includes(group))) setResearcher(true);
if (userGroups.riskManager.every(group => groups.includes(group))) setRiskMgr(true);

Less repeated code with a separate object for role checks

const groups = ['A', 'B', 'C', 'D', 'E']

const userGroups = {
  admin: {
    values: ['A', 'B'],
    set: function() {
      setAdmin(true)
    }
  },
  researcher: {
    values: ['C', 'E'],
    set: function() {
      setResearcher(true)
    }
  },
  riskManager: {
    values: ['B', 'C', 'D'],
    set: function() {
       setRiskMgr(true);
    }
  }
}

function setAdmin() {
  console.log('admin')
}

function setResearcher() {
  console.log('researcher')
}

function setRiskMgr() {
  console.log('risk manager')
}

for(const key in userGroups) {
  if(userGroups[key].values.every(group => groups.includes(group))) {
    userGroups[key].set();
  }
}

Solution 2:[2]

As @ChrisG mentioned, you can use Array.includes or Array.some instead.

const groups = ['A','B','C','D','E']

if (groups.some(group => ['A', 'B'].includes(group))) {
  setAdmin(true);
} else if (...) {
...
}

Solution 3:[3]

Its quite a simple solution with Array.includes

 const groups = ['A','B','C','D','E']

 if(groups.includes('A') && groups.includes('B')) {
    setAdmin(true);
 } else if(groups.includes('C') && groups.includes('E')) {
   setReasercher(true)
 } // ...

Solution 4:[4]

Assuming there is no issue with React useState, are you referring to OR, || statement, if so @Nick Vu has the answer, since you are just looping through the groups list, there is NO WAY to have two same element at single integration.

Else, if you want to achieve AND, && condition, then solution is otherwise.

Solution 5:[5]

const groups = ['A','B','C','D','E']

function setAdmin() {
    console.log('admin')
}


function setResearcher() {
  console.log('researcher')
}

function setRiskMgr() {
  console.log('risk manager')
}



if(arr.some(a=>a==="A")&&arr.some(a=>a==="B")) setAdmin(true);



if(arr.some(a=>a==="C")&&arr.some(a=>a==="E")) setResearcher(true);



if(arr.some(a=>a==="B")&&arr.some(a=>a==="C")&&arr.some(a=>a==="D")) setRiskMgr(true);

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 StPaulis
Solution 3 kritiz
Solution 4 Lance
Solution 5 hexin