Is it possible to add dynamically named properties to JavaScript object?

后端 未结 19 1595
攒了一身酷
攒了一身酷 2020-11-21 05:39

In JavaScript, I\'ve created an object like so:

var data = {
    \'PropertyA\': 1,
    \'PropertyB\': 2,
    \'PropertyC\': 3
};

Is it poss

相关标签:
19条回答
  • 2020-11-21 06:14

    A nice way to access from dynamic string names that contain objects (for example object.subobject.property)

    function ReadValue(varname)
    {
        var v=varname.split(".");
        var o=window;
        if(!v.length)
            return undefined;
        for(var i=0;i<v.length-1;i++)
            o=o[v[i]];
        return o[v[v.length-1]];
    }
    
    function AssignValue(varname,value)
    {
        var v=varname.split(".");
        var o=window;
        if(!v.length)
            return;
        for(var i=0;i<v.length-1;i++)
            o=o[v[i]];
        o[v[v.length-1]]=value;
    }
    

    Example:

    ReadValue("object.subobject.property");
    WriteValue("object.subobject.property",5);
    

    eval works for read value, but write value is a bit harder.

    A more advanced version (Create subclasses if they dont exists, and allows objects instead of global variables)

    function ReadValue(varname,o=window)
    {
        if(typeof(varname)==="undefined" || typeof(o)==="undefined" || o===null)
            return undefined;
        var v=varname.split(".");
        if(!v.length)
            return undefined;
        for(var i=0;i<v.length-1;i++)
        {
            if(o[v[i]]===null || typeof(o[v[i]])==="undefined") 
                o[v[i]]={};
            o=o[v[i]];
        }
        if(typeof(o[v[v.length-1]])==="undefined")    
            return undefined;
        else    
            return o[v[v.length-1]];
    }
    
    function AssignValue(varname,value,o=window)
    {
        if(typeof(varname)==="undefined" || typeof(o)==="undefined" || o===null)
            return;
        var v=varname.split(".");
        if(!v.length)
            return;
        for(var i=0;i<v.length-1;i++)
        {
            if(o[v[i]]===null || typeof(o[v[i]])==="undefined")
                o[v[i]]={};
            o=o[v[i]];
        }
        o[v[v.length-1]]=value;
    }
    

    Example:

    ReadValue("object.subobject.property",o);
    WriteValue("object.subobject.property",5,o);
    

    This is the same that o.object.subobject.property

    0 讨论(0)
  • 2020-11-21 06:15

    You can add as many more properties as you like simply by using the dot notation:

    var data = {
        var1:'somevalue'
    }
    data.newAttribute = 'newvalue'
    

    or:

    data[newattribute] = somevalue
    

    for dynamic keys.

    0 讨论(0)
  • 2020-11-21 06:18

    in addition to all the previous answers, and in case you're wondering how we're going to write dynamic property names in the Future using Computed Property Names ( ECMAScript 6 ), here's how:

    var person = "John Doe";
    var personId = "person_" + new Date().getTime();
    var personIndex = {
        [ personId ]: person
    //  ^ computed property name
    };
    
    personIndex[ personId ]; // "John Doe"
    

    reference: Understanding ECMAScript 6 - Nickolas Zakas

    0 讨论(0)
  • 2020-11-21 06:19

    Yes it is possible. Assuming:

    var data = {
        'PropertyA': 1,
        'PropertyB': 2,
        'PropertyC': 3
    };
    var propertyName = "someProperty";
    var propertyValue = "someValue";
    

    Either:

    data[propertyName] = propertyValue;
    

    or

    eval("data." + propertyName + " = '" + propertyValue + "'");
    

    The first method is preferred. eval() has the obvious security concerns if you're using values supplied by the user so don't use it if you can avoid it but it's worth knowing it exists and what it can do.

    You can reference this with:

    alert(data.someProperty);
    

    or

    data(data["someProperty"]);
    

    or

    alert(data[propertyName]);
    
    0 讨论(0)
  • 2020-11-21 06:19

    It can be useful if mixed new property add in runtime:

    data = { ...data, newPropery: value}
    

    However, spread operator use shallow copy but here we assign data to itself so should lose nothing

    0 讨论(0)
  • 2020-11-21 06:21

    ES6 introduces computed property names, which allows you to do

    let a = 'key'
    let myObj = {[a]: 10};
    // output will be {key:10}
    
    0 讨论(0)
提交回复
热议问题