我有从第三方API获取的对象,如下所示:
{
name:"Luke Skywalker",
__typename:"People",
Symbol(id):"ROOT_QUERY.people."
}
而且"卢克天行者"可以通过 object.name 访问, 如何才能访问该对象的Symbol(id)属性值?
答案 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");