I have an object fetched from 3rd party API as shown below:
{
name:\"Luke Skywalker\",
__typename:\"People\",
Symbol(id):\"ROOT_QUERY.people.\"
}
That object initializer is invalid, so it's hard to answer.
If that really is a Symbol-named property, the answer depends on whether the Symbol is globally-registered.
If it isn't, you can only discover the symbol via getOwnPropertySymbols
. If it's the only one, great, you're in good shape:
var data = {
name:"Luke Skywalker",
__typename:"People",
[Symbol("id")]:"ROOT_QUERY.people."
};
console.log(data[Object.getOwnPropertySymbols(data)[0]]);
That assumes that there's only one Symbol-named property, which we probably shouldn't do. Instead, let's look for the Symbol with the descriptive string "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");
But if it's globally-registered and you know what string it's registered under, you can use Symbol.for
to get it:
var data = {
name:"Luke Skywalker",
__typename:"People",
[Symbol.for("id")]:"ROOT_QUERY.people."
};
console.log(data[Symbol.for("id")]);
You can use Object.getOwnPropertySymbols() to retrieve it, but this would retrieve all symbols tied to an object. If you want to get that particular symbol on the object directly, you need to store that Symbol object else to be re-used.
const sym = Symbol(id);
const example = {
name:"Luke Skywalker",
__typename:"People",
[sym]:"ROOT_QUERY.people."
}
console.log(example[sym]) //Equals "ROOT_QUERY.people."
Symbols
were designed to define unique property names to avoid collisions. So you should either have access to the symbol used to construct the object or get all symbols using getOwnPropertySymbols
const obj = {
[Symbol('id')]: 1
}
console.log(obj[Symbol('id')])
const symbols = Object.getOwnPropertySymbols(obj)
console.log(obj[symbols[0]])
Adding to @T.J. Crowder, Symbols can also be discovered through Reflect.ownKeys
which will list all object own keys: property names & symbols.
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");