Mam obiekt pobrany z API 3RD Party, jak pokazano poniżej:

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

Podczas gdy "Luke Skywalker" można uzyskać po prostu obiekt.name , Jak mogę uzyskać dostęp do wartości własności symbolu (ID) tego obiektu?

17
Bakhtiiar Muzakparov 24 czerwiec 2017, 10:42

4 odpowiedzi

Najlepsza odpowiedź

Ten inicjator obiektu jest nieprawidłowy, więc trudno odpowiadać.

Jeśli to naprawdę jest właściwością o nazwie symbolu, odpowiedź zależy od tego, czy symbol jest zarejestrowany na całym świecie.

Jeśli nie, możesz odkryć tylko symbol przez getOwnPropertySymbols. Jeśli jest to jedyny, świetny, jesteś w dobrej formie:

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

Zakłada się, że istnieje tylko jedna właściwość symbolu, którą prawdopodobnie nie powinniśmy zrobić. Zamiast tego spójrzmy na symbol sznurka opisowego "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");

Ale jeśli jest to na całym świecie i wiesz, jaki ciąg jest zarejestrowany, możesz użyć Symbol.for, aby go zdobyć:

var data = {
    name:"Luke Skywalker",
    __typename:"People",
    [Symbol.for("id")]:"ROOT_QUERY.people."
};
console.log(data[Symbol.for("id")]);
25
T.J. Crowder 24 czerwiec 2017, 08:17

Dodawanie do @ t.j. Crowder, symbole można również odkryć za pomocą Reflect.ownKeys, który wyświetli wszystkie klucze własne obiektów: nazwy nieruchomości i wzmacniacz; symbolika.

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");
2
Marcos Casagrande 5 czerwiec 2018, 02:39

Możesz użyć obiektu.getownPropertySymbols (), aby go pobrać, ale pobierałoby to wszystkie symbole związane z obiektem. Jeśli chcesz uzyskać ten konkretny symbol na obiekcie bezpośrednio, musisz przechowywać ten obiekt symbolu, który będzie ponownie używany.

const sym = Symbol(id);
const example = {
  name:"Luke Skywalker",
  __typename:"People",
  [sym]:"ROOT_QUERY.people."
}

console.log(example[sym]) //Equals "ROOT_QUERY.people."
2
Nick Wyman 24 czerwiec 2017, 07:54

Symbols zostały zaprojektowane, aby zdefiniować unikalne nazwy właściwości, aby uniknąć kolizji. Więc powinieneś mieć dostęp do symbolu używanego do skonstruowania obiektu lub uzyskania wszystkich symboli za pomocą {X1}}

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

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

const symbols = Object.getOwnPropertySymbols(obj)

console.log(obj[symbols[0]])
2
Yury Tarabanko 24 czerwiec 2017, 07:51