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?
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?
with (obj) var result = eval(attr);
.
– dfsq
Commented
Feb 21, 2013 at 12:31
eval(attr)
will give "Reference Error for key1" Can you please explain more clearly?
– Manu K Mohan
Commented
Feb 21, 2013 at 12:37
eval(attr_string);
– dfsq
Commented
Feb 21, 2013 at 12:41
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/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval#never_use_eval!.
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'
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'));
var target = obj;
const parts = attr_string.split(".");
for (var part in parts)
target = target[part[part]];