Getting rid of eval for accesing "deep" properties

Discussion in 'Javascript' started by Ignacio Burgueño, Jul 30, 2008.

  1. 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
    Ignacio Burgueño, Jul 30, 2008
    #1
    1. Advertising

  2. Ignacio Burgueño <> writes:

    > 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
    --
    Lasse Reichstein Nielsen
    DHTML Death Colors: <URL:http://www.infimum.dk/HTML/rasterTriangleDOM.html>
    'Faith without judgement merely degrades the spirit divine.'
    Lasse Reichstein Nielsen, Jul 30, 2008
    #2
    1. Advertising

  3. Ignacio Burgueño

    Jorge Guest

    On Jul 31, 12:02 am, Lasse Reichstein Nielsen <> wrote:
    >
    > 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.
    Jorge, Jul 30, 2008
    #3
  4. Jorge wrote:
    > On Jul 31, 12:02 am, Lasse Reichstein Nielsen <> wrote:
    >> 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
    Ignacio Burgueño, Jul 31, 2008
    #4
  5. Ignacio Burgueño <> writes:

    > 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
    --
    Lasse Reichstein Nielsen
    DHTML Death Colors: <URL:http://www.infimum.dk/HTML/rasterTriangleDOM.html>
    'Faith without judgement merely degrades the spirit divine.'
    Lasse Reichstein Nielsen, Aug 1, 2008
    #5
  6. Lasse Reichstein Nielsen wrote:
    > Ignacio Burgueño <> writes:
    >
    >> 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


    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
    Ignacio Burgueño, Aug 1, 2008
    #6
  7. Ignacio Burgueño wrote:
    > Lasse Reichstein Nielsen wrote:
    >> Ignacio Burgueño <> writes:
    >>> 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.

    >
    > 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
    --
    Prototype.js was written by people who don't know javascript for people
    who don't know javascript. People who don't know javascript are not
    the best source of advice on designing systems that use javascript.
    -- Richard Cornford, cljs, <f806at$ail$1$>
    Thomas 'PointedEars' Lahn, Aug 1, 2008
    #7
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Eric Newton
    Replies:
    3
    Views:
    9,393
    Brock Allen
    Apr 4, 2005
  2. DataBinder.Eval and Eval.

    , Jun 16, 2006, in forum: ASP .Net
    Replies:
    1
    Views:
    542
    Karl Seguin [MVP]
    Jun 16, 2006
  3. Alex van der Spek

    eval('07') works, eval('08') fails, why?

    Alex van der Spek, Jan 8, 2009, in forum: Python
    Replies:
    6
    Views:
    1,435
    Bruno Desthuilliers
    Jan 8, 2009
  4. StrongBad

    Accesing Office Document Properties with ASP

    StrongBad, Nov 9, 2004, in forum: ASP General
    Replies:
    3
    Views:
    139
    Ray Costanzo [MVP]
    Nov 10, 2004
  5. Proper

    Get rid of 'eval'

    Proper, Oct 6, 2008, in forum: Javascript
    Replies:
    5
    Views:
    86
    Proper
    Oct 7, 2008
Loading...

Share This Page