#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)