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

i7uaboj4  于 2023-01-29  发布在  Java
关注(0)|答案(4)|浏览(206)

我从第三方API获取了一个对象,如下所示:

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

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

doinxwow

doinxwow1#

Symbols被设计为定义唯一的属性名以避免冲突,因此您应该访问用于构造对象的符号,或者使用getOwnPropertySymbols获取所有符号

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

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

const symbols = Object.getOwnPropertySymbols(obj)

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

elcex8rz2#

那个对象初始化器是无效的,所以很难回答。
如果这真的是一个Symbol命名的属性,答案取决于Symbol是否全局注册。
如果不是,你只能通过getOwnPropertySymbols找到这个符号。如果是唯一的符号,很好,你的状态很好:

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

这里假设只有一个Symbol命名的属性,我们可能不应该这样做,相反,让我们寻找描述为"id"的Symbol:

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

我应该注意到,多个符号具有相同的描述是完全有效的,所以上面的代码再次使用了它找到的 * 第一个 * 符号,但尽管这很奇怪,但可能有多个符号:

const data = {
    name: "Luke Skywalker",
    __typename: "People",
    [Symbol("id")]: "Value for the first Symbol(id)",
    [Symbol("id")]: "Value for the second Symbol(id)",
};
const idSymbolKeys = Object.getOwnPropertySymbols(data).filter(
    (s) => s.description === "id"
);
console.log("'id' symbols found:", idSymbolKeys.length);
console.log(data[idSymbolKeys[0]]);
console.log(data[idSymbolKeys[1]]);

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

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

t8e9dugd3#

添加到@ T. J. Crowder,符号也可以通过Reflect.ownKeys发现,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");
djmepvbi

djmepvbi4#

可以使用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."

相关问题