Getting rid of eval for accesing "deep" properties

I

Ignacio Burgueño

Hi everyone.

I'm dealing with some javascript code which uses eval to access
properties of an object.
For instance, I have the following:

var events = {};
events.flatUsers = {};
events.flatUsers.Clone = "I'm the Clone property";
events.flatUsers.Edit = "I'm the Edit property";
events.flatUsers.Delete = "I'm the Delete property";

var key = "flatUsers.Clone";

Right now, given 'events' and the key 'flatUsers.Clone', eval is used to
retrieve events.flatUsers.Clone

window.alert( eval("events." + key) );

I'd like to get rid of eval, and since I cannot do just:
events[key]

I wrote the following:
function evaluate() {
var context = this;
for(var i = 0; i < arguments.length; i++) {
context = context[arguments];
}
return context;
}

window.alert(evaluate.apply(events, key.split('.')));

Surely this can be improved, since I'm a newbie in Javascript. Any
suggestions?

Regards,
Ignacio Burgueño
 
L

Lasse Reichstein Nielsen

Ignacio Burgueño said:
Right now, given 'events' and the key 'flatUsers.Clone', eval is used
to retrieve events.flatUsers.Clone

window.alert( eval("events." + key) );
....
I wrote the following:
function evaluate() {
var context = this;
for(var i = 0; i < arguments.length; i++) {
context = context[arguments];
}
return context;
}

window.alert(evaluate.apply(events, key.split('.')));

Surely this can be improved, since I'm a newbie in Javascript. Any
suggestions?


Looks a little on the overkill side, but not far from what I would do:

function getProperty(obj, propPath) {
var parts = propPath.split(/\./g);
for(var i = 0; i < parts.length; i++) {
obj = obj[parts];
}
return obj;
}

/L
 
J

Jorge

function getProperty(obj, propPath) {
 var parts = propPath.split(/\./g);
 for(var i = 0; i < parts.length; i++) {
   obj = obj[parts];
 }
 return obj;

}


Or

function getProperty (obj, parts) {
parts= parts.split(/\./g);
while (parts.length) { obj= obj[parts.shift()] }
return obj;
}

--Jorge.
 
I

Ignacio Burgueño

Jorge said:
function getProperty(obj, propPath) {
var parts = propPath.split(/\./g);
for(var i = 0; i < parts.length; i++) {
obj = obj[parts];
}
return obj;

}


Or

function getProperty (obj, parts) {
parts= parts.split(/\./g);
while (parts.length) { obj= obj[parts.shift()] }
return obj;
}

--Jorge.



Thanks both!
I was curious about the performance penalty. If case there's any
interest, here are the times it took to run 100.000 times each method
(eval, my first attempt (I called it 'evaluate') and Jorge's getProperty
variation)
It seems that in this particular (and simple) case, there's not a huge
performance penalty by using eval.

| IE7 | IE6 |Opera |Safari| FF2 | FF3 |IE7(2)|
------------+------+------+------+------+------+------+------|
eval | 1468 | 2953 | 1547 | 812 | 4625 | 1151 | 8188 |
------------+------+------+------+------+------+------+------|
evaluate | 2110 | 4469 | 609 | 704 | 3828 | 676 | 2109 |
------------+------+------+------+------+------+------+------|
getProperty | 2234 | 5187 | 1047 | 343 | 3563 | 709 | 2250 |
-------------------------------------------------------------/


IE7 = 7.0.5730.11
IE7(2) = The same, but with script debugging enabled
IE6 = 6.0.2900.2180
Opera = 9.51.10081
Safari = 3.1.2 (525.21)
FF3 = 3.0.1
FF2 = 2.0.0.16

Tests in Firefox were run with all extensions disabled.

Regards,
Ignacio Burgueño
 
L

Lasse Reichstein Nielsen

Ignacio Burgueño said:
It seems that in this particular (and simple) case, there's not a huge
performance penalty by using eval.

Performance is not the (primary) reason to avoid "eval". A much
bigger problem is that code crated by putting strings together at
runtime is often fragile, and when it fails, it's hard to debug.

/L
 
I

Ignacio Burgueño

Lasse said:
Performance is not the (primary) reason to avoid "eval". A much
bigger problem is that code crated by putting strings together at
runtime is often fragile, and when it fails, it's hard to debug.

/L

Indeed, you're right. I'd never use eval if I weren't sure where the
code came from. I don't like the way it's being used in my code, but,
well, I can't change that at the moment.

Thanks for your help, Lasse.

Regards,
Ignacio Burgueño
 
T

Thomas 'PointedEars' Lahn

Ignacio said:
Indeed, you're right. I'd never use eval if I weren't sure where the
code came from. I don't like the way it's being used in my code, but,
well, I can't change that at the moment.

You have been shown how to change it right now.


PointedEars
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,764
Messages
2,569,567
Members
45,041
Latest member
RomeoFarnh

Latest Threads

Top