以下に示すように、サードパーティのAPIからオブジェクトをフェッチしました。
{
name:"Luke Skywalker",
__typename:"People",
Symbol(id):"ROOT_QUERY.people."
}
「LukeSkywalker」には単純にobject.nameでアクセスできますが、このオブジェクトのSymbol(id)プロパティの値にアクセスするにはどうすればよいですか?
そのオブジェクト初期化子は無効であるため、答えるのは難しいです。
それが本当にSymbolという名前のプロパティである場合、答えはSymbolがグローバルに登録されているかどうかによって異なります。
そうでない場合は、getOwnPropertySymbols
を介してのみシンボルを見つけることができます。それが唯一の素晴らしいものであれば、あなたは良い状態にあります:
_var data = {
name:"Luke Skywalker",
__typename:"People",
[Symbol("id")]:"ROOT_QUERY.people."
};
console.log(data[Object.getOwnPropertySymbols(data)[0]]);
_
これは、Symbol-namedプロパティが1つしかないことを前提としていますが、これはおそらく行うべきではありません。代わりに、説明文字列"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")]);
_
Object.getOwnPropertySymbols()を使用して取得できますが、これにより、オブジェクトに関連付けられているすべてのシンボルが取得されます。その特定のシンボルをオブジェクトに直接取得したい場合は、そのシンボルオブジェクトを保存して再利用する必要があります。
const sym = Symbol(id);
const example = {
name:"Luke Skywalker",
__typename:"People",
[sym]:"ROOT_QUERY.people."
}
console.log(example[sym]) //Equals "ROOT_QUERY.people."
@ T.Jに追加します。 Crowder、SymbolsReflect.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");
Symbols
は、衝突を回避するために一意のプロパティ名を定義するように設計されています。したがって、オブジェクトの構築に使用されるシンボルにアクセスするか、 getOwnPropertySymbols
を使用してすべてのシンボルを取得する必要があります。
const obj = {
[Symbol('id')]: 1
}
console.log(obj[Symbol('id')])
const symbols = Object.getOwnPropertySymbols(obj)
console.log(obj[symbols[0]])