Возвращение свойства "name" внутри объекта без знания "name" - PullRequest
0 голосов
/ 08 мая 2020

Хорошо, наверное, это действительно глупый вопрос, но я должен его задать. У меня есть объект внутри объекта:

var user = {
    playlist: "abcd1234",
    role: {
      basic: true,
    }
};

Я знаю, что могу получить доступ к роли:

user.role

, который вернет {basi c: true} в консоли. У меня вопрос: как я мог вернуть просто «basi c», если я не знал, что такое внутренняя роль?

Я работаю над проектом, в котором я получаю несколько объектов (пользователей) и мне нужно поместить их роли в поле выбора. Я просто надеялся получить "basi c" (например), чтобы он выглядел немного лучше как вариант для выбора пользователем, а не basi c = true.

Ответы [ 5 ]

0 голосов
/ 08 мая 2020

Если вы хотите получить свойства объекта, вы можете просто использовать

var user = {
    playlist: "abcd1234",
    role: {
      basic: true,
    }
};
var roles=Object.keys(user.role);
console.log(roles);
0 голосов
/ 08 мая 2020
<html>
<script>
var user = {
    playlist: "abcd1234",
    role: {
      basic: true,
      admin: false,
      free: false
    }
};


for(role in user.role){
    if(user.role[role]){
        console.log(role);
    }
}
</script>
</html>

Таким образом, вы, по сути, перебираете неизвестные свойства в объекте user.role. Для каждого role в user.role проверьте, верно ли оно с помощью user.role[role] - [role] - это имя переменной, о котором мы не знаем - тогда я просто console.log, если это правда, вы можете запустить другие logi c, если вы используете sh.

0 голосов
/ 08 мая 2020

Если все, что вам нужно, это имя свойства внутри user.role, Object.keys () , вероятно, то, что вам нужно. Он возвращает в массиве все имена свойств объекта (также известные как «ключи»).

var user = {
    playlist: "abcd1234",
    role: {
      basic: true,
    }
};

let roles = Object.keys(user.role);
console.log(roles); // ["basic"]

Но если вам нужны только роли true, это требует некоторой фильтрации:

var user = {
    playlist: "abcd1234",
    role: {
      basic: true,
      admin: false,
      free: true
    }
};

const reduceTrues = (acc, [key, val]) => {
  if (val === true) { acc.push(key); }
  return acc;
}
const trueRoles = Object.entries(user.role).reduce(reduceTrues, []);
console.log(trueRoles);
// [ 'basic', 'free' ]
0 голосов
/ 08 мая 2020

Используйте Object.keys() метод, подобный этому

var user = {
  playlist: "abcd1234",
  role: {
    basic: true,
  }
}
const role = Object.keys(user.role)
console.log(role) // ["basic"]
console.log(user.role[role]) // true

Полная документация в MDN здесь

0 голосов
/ 08 мая 2020

Если у вас несколько ролей, я предлагаю вам сделать роли в виде списка, разделенного запятыми, а затем разделить его методом String.split().

Например:

var user = { playlist: "abcd1234", role: "basic, pro, other" };

var roles = user.role.split(",");
//You now have an array of roles

Но в если у вас всего 1 роль, просто задайте ее как строку, как в

    var user = { playlist: "abcd1234", role: "basic" };

//You can check if role is empty by a simple if statement

if(user.role != null && user.role != undefined && user.role != "")
console.log("user role is "+user.role);
...