views:

63

answers:

3

I'd like to know if standard JS provides a way of splitting a string straight into a set of variables during their initial declaration. For example in perl I would use:

my ($a, $b, $c) = split '-', $str;

In Firefox I can write

var [a, b, c] = str.split('-');

But this syntax is not part of the ECMA standard and as such breaks in all other browsers. What I'm trying to do is avoid having to write:

var array = str.split('-');
var a = array[0];
var b = array[1];
var c = array[2];

Because for the code that I'm writing at the moment such a method would be a real pain, I'm creating 20 variables from 7 different splits and don't want to have to use such a verbose method.

Does anyone know of an elegant way to do this?

+2  A: 

You can only do it slightly more elegantly by omitting the var keyword for each variable and separating the expressions by commas:

var array = str.split('-');
var a = array[0], b = array[1], c = array[2];
Andy E
I suspected as much. Seems a damn shame to have to be so verbose about it. Ah well, thanks for your help :)
nb5
+2  A: 
var str = '123',
    array = str.split('');

(function(a, b, c) {
    a; // 1
    b; // 2
    c; // 3
}).apply(null, array)
Török Gábor
apply is a cool method but I'm looking to use less code rather than more ;)
nb5
@nb5: I don't think it's *that* much more code than `var a = array[0], b = array[1], c = array[2];`.
Török Gábor
But does it work? I do not see it work either :(
mplungjan
perhaps but in this script I'd be using this 7 times.
nb5
@mplungjain: It should work. You have to deal with the variables to see their values, e.g. try to `alert` them.
Török Gábor
+1 from me. The one difference between this and the comma-separated var solution is that these variables are available only within the scope of this function, rather than the outer scope too. That's not a problem if this closure is wrapped around the entire code that uses the variables.
Andy E
A: 

You could create a function that will loop through the Array that's created by the str.split method and auto generate variables this way:

function autoGenerateVarFromArray(srcArray, varNamePrefix)
{
  var i = 0
  while(i < srcArray.length)
  {
    this[varNamePrefix +'_' + i] = srcArray[i]; 
    i++;
  } 
}

Here's an example of how to use this:

var someString = "Mary had a little Lamb";
autoGenerateVarFromArray(someString.split(' '), 'temp');

alert(this.temp_3); // little
Gary
This pretty cool but as far as I can see autogenerated variables using a single name prefix followed by a number would be little different from just directly referencing the array item by index.
nb5
This method prevents code minifying.
Török Gábor
@nb5: That's true. This solution might be more scalable if you have a huge array and a lot of variables to initialize. If you just have a small array size then the other solutions posted are not so bad (var apple = a[1], banana = a[2], etc.)
Gary
@Torok: No arguments there.
Gary