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?

Manu K Mohan
  • 823
  • 4
  • 9
  • 29

4 Answers4

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!.

Roi Shabtai
  • 2,981
  • 2
  • 31
  • 47
Manu K Mohan
  • 823
  • 4
  • 9
  • 29
  • NEVER USE EVAL!!! https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval#never_use_eval! – Roi Shabtai Jun 01 '22 at 15:58
0
var target = obj;
const parts = attr_string.split(".");
for (var part in parts)
  target = target[part[part]];
Roi Shabtai
  • 2,981
  • 2
  • 31
  • 47
John Zwinck
  • 239,568
  • 38
  • 324
  • 436
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'
whitneyit
  • 1,226
  • 8
  • 17
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'));
Billy Moon
  • 57,113
  • 24
  • 136
  • 237