访问对象上 Symbol(id) 属性的值

新手上路,请多包涵

我有一个从 3rd 方 API 获取的对象,如下所示:

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

虽然可以通过简单的 object.name 访问“Luke Skywalker”,但我如何才能访问该对象的 Symbol(id) 属性的值?

原文由 Bakhtiiar Muzakparov 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 801
2 个回答

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

如果那确实是一个以 Symbol 命名的属性,则答案取决于该 Symbol 是否已全局注册。

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

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

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

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

但是,如果它是全局注册的并且您知道它在哪个字符串下注册,则可以使用 Symbol.for 来获取它:

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

原文由 T.J. Crowder 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

 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");

原文由 Marcos Casagrande 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题