访问对象

时间:2017-06-24 07:42:15

标签: javascript ecmascript-6 ecmascript-5

我有从第三方API获取的对象,如下所示:

{
    name:"Luke Skywalker",
    __typename:"People",
    Symbol(id):"ROOT_QUERY.people."
}

而且"卢克天行者"可以通过 object.name 访问, 如何才能访问该对象的Symbol(id)属性值?

4 个答案:

答案 0 :(得分:8)

该对象初始值设定项无效,因此很难回答。

如果这确实是符号命名属性,则答案取决于符号是否全局注册。

如果不是,则只能通过getOwnPropertySymbols发现符号。如果它是唯一一个,那么,你的状态很好:

var data = {
    name:"Luke Skywalker",
    __typename:"People",
    [Symbol("id")]:"ROOT_QUERY.people."
};
console.log(data[Object.getOwnPropertySymbols(data)[0]]);

假设只有一个符号命名属性,我们可能不应该这样做。相反,让我们使用描述性字符串"Symbol(id)"来查找符号:

var data = {
    name:"Luke Skywalker",
    __typename:"People",
    [Symbol("id")]:"ROOT_QUERY.people."
};
var sym = Object.getOwnPropertySymbols(data).find(function(s) {
  return String(s) === "Symbol(id)";
});
console.log(sym ? data[sym] : "Symbol(id) not found");

但如果它是全球注册的并且您知道它注册了什么字符串,您可以使用Symbol.for来获取它:

var data = {
    name:"Luke Skywalker",
    __typename:"People",
    [Symbol.for("id")]:"ROOT_QUERY.people."
};
console.log(data[Symbol.for("id")]);

答案 1 :(得分:2)

您可以使用Object.getOwnPropertySymbols()来检索它,但这将检索绑定到对象的所有符号。如果要直接在对象上获取该特定符号,则需要存储该Symbol对象以供重用。

const sym = Symbol(id);
const example = {
  name:"Luke Skywalker",
  __typename:"People",
  [sym]:"ROOT_QUERY.people."
}

console.log(example[sym]) //Equals "ROOT_QUERY.people."

答案 2 :(得分:1)

Symbols旨在定义唯一的属性名称以避免冲突。因此,您应该可以访问用于构造对象的符号,或使用getOwnPropertySymbols

获取所有符号

const obj = {
  [Symbol('id')]: 1
}

console.log(obj[Symbol('id')])

const symbols = Object.getOwnPropertySymbols(obj)

console.log(obj[symbols[0]])

答案 3 :(得分:1)

添加到@ T.J.还可以通过Reflect.ownKeys发现Crowder,符号,它将列出所有对象自己的密钥:属性名称&符号。



const data = {
    name:"Luke Skywalker",
    __typename:"People",
    [Symbol("id")]:"ROOT_QUERY.people."
};

const sym = Reflect.ownKeys(data).find(s => {
  return String(s) === "Symbol(id)";
});
console.log(sym ? data[sym] : "Symbol(id) not found");