Проверка, существует ли значение в массиве объектов без цикла for

#javascript #typescript

#javascript #typescript

Вопрос:

 "Roles":
{ 
    "0_A":["Developer"],
    "0_B":["Developer"],
    "0_C":["Developer","Tester","Player"],
    "0_D":["Tester"]
}
  

Есть ли способ проверить, существует ли значение ‘Player’ / ‘Tester’ / ‘Developer’ где-либо в объекте ‘Roles’? Это то, что я пробовал:

 let isPlayer= false;
if (response) {
  const k = Object.keys(response["Roles"]);
  for (let index = 0; index < k.length; index  ) {
    if (response["Roles"][k[index]].indexOf("Player") > -1) {
      isPlayer= true;
      break;
    }
  }    
}
  

Есть ли способ сделать это без цикла for?

Спасибо!

Ответ №1:

Одной из альтернатив является использование Array.some() в сочетании с Array.includes() над Object.Values() входного объекта. Пример того, как это сделать, показан в приведенном ниже фрагменте:

 const response = {};
response["Roles"] = {
  "0_A":["Developer"],
  "0_B":["Developer"],
  "0_C":["Developer","Tester","Player"],
  "0_D":["Tester"]
};

const checkForType = (resp, type) =>
{
    let typeExists = false;

    if (resp)
    {
        let roles = resp["Roles"] || {};
        typeExists = Object.values(roles).some(arr => arr.includes(type));
    }

    return typeExists;
}

console.log(checkForType(response, "Player"));
console.log(checkForType(response, "Developer"));
console.log(checkForType(response, "Team Leader"));  
 .as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}  

Ответ №2:

Как насчет использования .find() и .includes , как показано ниже:

 let isPlayer = false;
if (response) {
  const roleNames = Object.values(response["Roles"]);
  const playerFound = roleNames.find(names => names.includes('Player'))
  isPlayer = !!playerFound;  
}
  

Ответ №3:

Вы можете сгладить 2D-массив, возвращаемый Object.values() и используемый includes для проверки, содержит ли массив имя роли:

 const response = {
  "Roles": {
    "0_A": ["Developer"],
    "0_B": ["Developer"],
    "0_C": ["Developer", "Tester", "Player"],
    "0_D": ["Tester"]
  }
}

let isPlayer = Object.values(response.Roles)
                      .flat()
                      .includes("Player")
                      
console.log(isPlayer)