www.webdeveloper.com
Results 1 to 5 of 5

Thread: JavaScript syntax question: conditional list element?

Hybrid View

  1. #1
    Join Date
    Sep 2010
    Posts
    2

    Cool JavaScript syntax question: conditional list element?

    This is probably an easy one for you Javascript wonks...

    I'm looking for a way to conditionally include or exclude a list element -- in Perl this is easy, how's it done in Javascript?

    x = dosomething("yadda", (sometest() ? "yep" : ()), "blah");

    So if sometest() returns TRUE then then we dosomething("yadda","yep","blah") otherwise we dosomething("yadda","blah").

    Is that possible in Javascript?

  2. #2
    Join Date
    Jan 2003
    Location
    Texas
    Posts
    10,413
    Hi,

    You're very close! Try something like the below (if it doesn't work, try using two equals signs instead of three; it assumes you're casting strict types).


    Code:
    var x = dosomething("yadda", (sometest()===true? "yep" : "blah"));

  3. #3
    Join Date
    Sep 2010
    Posts
    2

    Looking for an optional empty list element

    Well that's not quite what I'm after -- I'm hoping to include two or three elements, not choose which of two values to use for the second element.

    In Perl, this is simply

    $x = dosomething(
    "yadda",
    (sometest() ? "yep" : ()),
    "blah",
    );

    Where the () signifies an empty list, so that the argument list is either a two-item "yadda","blah" or a three-item "yadda","yep","blah". (And the trailing comma is a great convenience for future cut-and-paste of lines of code.)

    Does javascript have an empty-list expression like () in perl?

  4. #4
    Join Date
    Jan 2003
    Location
    Texas
    Posts
    10,413
    Quote Originally Posted by wdt View Post
    Does javascript have an empty-list expression like () in perl?
    To Rnd's credit, he's already answered your question. I have some additional input that I'd like to share, though. Feel free to ignore me if you aren't interested in exploring alternative design for your program.

    You can use object or array literal syntax({} for an object, [] for an array), but you'll have to modify the way your
    dosomething() function works. It's appropriate to use an object as a parameter for JavaScript functions anyway.

    Say your function looks like this:


    Code:
    function dosomething (a, b, c){
      alert([a, b, c].join(", "));
      return [a, b, c];
    }
    This is the design of your existing function, which takes the named parameters and performs operations on them. However, you must always call your dosomething() function with its parameters in a specific order or sequence. This can make programming difficult sometimes because, as you have already encountered, you have to specify something in the first or second parameter location in order to define the value of another.

    Instead, you can rewrite your function to something like this:


    Code:
    function dosomething (params){
     alert ([params.a, params.b, params.c].join(", "));
     return [params.a, params.b, params.c];
    }
    And now you would pass an object to your function instead. So when you invoke the function, it could look like this:

    Code:
    dosomething ({a: 'value a', b: 'value b', c: 'value c'});
    The advantage now is that you can choose whether or not to define properties a, b, or c. In other words, you could do this:

    Code:
    dosomething ( (sometest() === true) ? {a: 'value a', b: 'value b', c: 'value c'} : {a: 'value a by itself'} );
    Essentially, you can configure the properties of an object and pass the entire object to your function, and then allow the function (dosomething()) to handle the object. This has the additional benefit of permitting empty objects (which gets as close as possible to your empty list in Perl)

    Code:
    dosomething ( (sometest()===true)? {a: 'value a', b: 'value b', c: 'value c'} : {} );
    Of course, your new dosomething function should account for the possibility that the object passed to it may have properties omitted. In other words, the function should prepare to deal with an empty object.

    Code:
    function dosomething (params){
     if (typeof params.a !== 'undefined'){
      return params.a;
     }
    }
    There are better, more dynamic ways for your function to handle object parameters by extending an empty object and cloning properties not inherited by the object passed, but you get the basic idea.

    Hope this helps provide some insight into the language. Happy coding.

  5. #5
    Join Date
    Jul 2008
    Location
    urbana, il
    Posts
    2,787
    use "undefined" instead of "()" but know that any use of a comma will increment the argument slot passed to a function; youll pass dosomething("yadda",undefined,"blah") .

    to presever the order, you can do some fancy array/apply things, or code two function invocations:
    Code:
    sometest() ? dosomething("yadda","yep","blah") : dosomething("yadda","blah") ;

    a functional solution:
    Code:
    dosomething.apply(this, ["yadda", sometest()?"yep":null,"blah"].filter(Boolean)  );

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
HTML5 Development Center



Recent Articles