我从第三方API获取了一个对象,如下所示:
{
name:"Luke Skywalker",
__typename:"People",
Symbol(id):"ROOT_QUERY.people."
}
虽然可以通过简单的object.name访问"Luke Skywalker",但是我如何获取该对象的Symbol(id)属性的值?
我从第三方API获取了一个对象,如下所示:
{
name:"Luke Skywalker",
__typename:"People",
Symbol(id):"ROOT_QUERY.people."
}
虽然可以通过简单的object.name访问"Luke Skywalker",但是我如何获取该对象的Symbol(id)属性的值?
那个对象初始化器是无效的,所以很难回答。
如果那真的是一个以Symbol命名的属性,答案取决于该Symbol是否全局注册。
如果没有被注册,你只能通过getOwnPropertySymbols
发现该Symbol。如果它是唯一的,那太棒了,你就处于良好的状态:
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")]);
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");
const sym = Symbol(id);
const example = {
name:"Luke Skywalker",
__typename:"People",
[sym]:"ROOT_QUERY.people."
}
console.log(example[sym]) //Equals "ROOT_QUERY.people."
Symbols
的设计初衷是为了定义唯一的属性名称以避免冲突。因此,您应该要么访问用于构造对象的符号,要么使用getOwnPropertySymbols
获取所有符号。
const obj = {
[Symbol('id')]: 1
}
console.log(obj[Symbol('id')])
const symbols = Object.getOwnPropertySymbols(obj)
console.log(obj[symbols[0]])
Symbol.for
之后,冲突问题又出现了。 - user6445533
objectVariable['Symbol(id)']
吗?对我来说看起来很奇怪。或者也许是objectVariable.Symbol(id)
? - ringbuffer_peekid
是什么,而且它们显著地影响到问题的答案。Yury的回答是一种方式,但请注意,如果该符号是全局注册的,另一种方式将涉及Symbol.for
。因此,我们需要更多信息。 - T.J. CrowderSymbol("id")
还是Symbol.for("id")
创建的,Chrome的控制台都会以相同的方式显示Symbol。有关详细信息,请参见我的答案。 - T.J. Crowder