4

I am trying to access a string "key1.key2" as properties of an object. For example :

var obj = { key1 : {key2 : "value1", key3 : "value2"}};
var attr_string = "key1.key2";

The variable attr_string is a string of attributes in a nested object joined by ".". It can be of any depth like "key1.key2.key3.key4..."

I want something like obj.attr_string to give the value of obj["key1"]["key2"] that is "value1"

How to achieve this?

10
  • A combination of two anti-patterns: with (obj) var result = eval(attr);. Commented Feb 21, 2013 at 12:31
  • 1
    possible duplicate of Accessing nested JavaScript objects with string key Commented Feb 21, 2013 at 12:35
  • 1
    Please read: 'There is no such thing as a "JSON object"'. What you have is a normal JavaScript object. Commented Feb 21, 2013 at 12:36
  • @dfsq I dont get it. eval(attr) will give "Reference Error for key1" Can you please explain more clearly? Commented Feb 21, 2013 at 12:37
  • @ManuKMohan eval(attr_string); Commented Feb 21, 2013 at 12:41

4 Answers 4

3

Thanks @dfsq for remembering me the use of eval.

Here is what I was expecting, a simple way to evaluate the objects string attribute.

var obj = { key1 : {key2 : "value1", key3 : "value2"}};
var attr_string = "key1.key2";

var result = eval("obj."+attr_string);

There is no need of splitting the string with "." and then putting it in a loop to get the value. eval can evaluate any string with javascript code statement.

Be noted: although the code functions as expected, eval should not be used!!!

see: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval#never_use_eval!.

Sign up to request clarification or add additional context in comments.

1 Comment

0

Is this what you are after?

var obj = { key1: { key2A: 'x', key2B: { key3: 'y' } } },
    attr_string = 'key1.key2B.key3',

    find = function ( obj, str ) {

        var index = 0,
            arr = str.split( '.' );

        if ( arr.length ) {
            while ( typeof obj === 'object' &&  arr[ index ] in obj ) {
                obj = obj[ arr[ index ] ];
                index++;
            }
        }

        return obj;

    };


find( obj, attr_string ); // Returns 'y'

Comments

0

fixing up @John's answer into a re-usable function (which I will be using myself)

function nested(obj, attrString){
    var path = attrString.split(".");
    for (var i in path){
        obj = obj[path[i]];
    }
    return obj;
}

// test it out...
x = {a:{b:{c:"happy days"}}};
console.log(nested(x, 'a'));
console.log(nested(x, 'a.b'));
console.log(nested(x, 'a.b.c'));

Comments

0
var target = obj;
const parts = attr_string.split(".");
for (var part in parts)
  target = target[part[part]];

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.