Access the value of Symbol(id) property on an object

前端 未结 4 603
太阳男子
太阳男子 2021-02-02 16:22

I have an object fetched from 3rd party API as shown below:

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


        
相关标签:
4条回答
  • 2021-02-02 16:45

    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")]);

    0 讨论(0)
  • 2021-02-02 16:50

    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."
    
    0 讨论(0)
  • 2021-02-02 16:54

    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]])

    0 讨论(0)
  • 2021-02-02 16:59

    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");

    0 讨论(0)
提交回复
热议问题