John Smith
John Smith

Reputation: 11

JavaScript: Dynamically create array

I'm trying to dynamically create an array from another one in JavaScript. I have a string which is a mathematical literal expression like this '2a + 3b + 4a + 5c': I just want to split it into an array with only the literal part of the number (Ex. 'a,b,a,c').

I've tried to use the following code to do this :

var expression = '2a + 3b + 4a + 5c';
var NumbersArray = expression.split(' + '); /* NumbersArray = 2a,3b,4a,5c */
alert('So far it's working!');
var LettersArray = new Array();
for (var i = 0; i < NumbersArray.length; i++) {
    eval('var LettersArray[' + i + '] = NumbersArray[' + i + '].replace(/[0-9]/g,"");');
    alert(eval('LettersArray[' + i + ']'));
}

But it doesn't work! How can I fix it?

Upvotes: 0

Views: 320

Answers (5)

talemyn
talemyn

Reputation: 7950

How flexible does this need to be? If your pattern is always going to be [number][letter] + [number][letter] + [number][letter] + [number][letter] + ...., then you could go really basic:

var expression = '2a + 3b + 4a + 5c';
var NumbersArray = expression.split(' + '); /* NumbersArray = 2a,3b,4a,5c */
var LettersArray = expression.match(/[a-z]/g); /* LettersArray = a,b,a,c */

For a little more flexibility, all you would need to do is change up the regex pattern a little bit:

  • If you needed to account for multi-letter variables, you could change /[a-z]/g to /[a-z]+/g.
  • If you needed to account for uppercase variables, you could change /[a-z]/g to /[a-z]+/gi.

Upvotes: 0

Mithun Satheesh
Mithun Satheesh

Reputation: 27845

the string in your alert breaks. It should be

 alert("So far it's working!");

also at eval in your loop same issue is there

this code works

var expression = '2a + 3b + 4a + 5c';
var NumbersArray = expression.split(' + '); /* NumbersArray = 2a,3b,4a,5c */
var LettersArray = [];
var evalit;

for (var i = 0; i < NumbersArray.length; i++) {

    evalit = "LettersArray[" + i + "] = NumbersArray[" + i + "].replace(/[0-9]/g,'');";

    eval(evalit);
    alert(LettersArray[i]);
}

here is a demo fiddle

also try to avoid eval at places where you dont need it.

Upvotes: 1

Chad
Chad

Reputation: 19609

Lots of errors here, tried to comment all of my fixes:

var expression = '2a + 3b + 4a + 5c';
var NumbersArray = expression.split(' + '); /* NumbersArray = 2a,3b,4a,5c */

//using single quotes inside single quotes doesn't work without escaping, try double quotes instead
alert("So far it's working!");

//use array literals [], not new Array() unless you need it
var LettersArray = [];

for (var i = 0; i < NumbersArray.length; i++) {
    //why is eval used here? and why are you using var to re-declare LettersArray?
    //eval('var LettersArray[' + i + '] = NumbersArray[' + i + '].replace(/[0-9]/g,"");');
    //alert(eval('LettersArray[' + i + ']'));

    //no need for eval, just access array indexes
    LettersArray[i] = NumbersArray[i].replace(/[0-9]/g, '');
    alert(LettersArray[i]);
}

Working example: http://jsfiddle.net/FERj5/

A quicker way to accomplish the same thing would be:

var expression = '2a + 3b + 4a + 5c';
var letters = expression.replace(/\d+/g, '').split(' + ');
//now letters == ['a', 'b', 'a', 'c']

Upvotes: 5

meub
meub

Reputation: 2308

Not sure why you are using eval. Try this:

var expression = '2a + 3b + 4a + 5c';
var NumbersArray = expression.split(' + '); /* NumbersArray = 2a,3b,4a,5c */
var LettersArray = new Array();

for (var i = 0; i < NumbersArray.length; i++) {

    LettersArray[i] = NumbersArray[i].replace(/[0-9]/g,"");;
    alert(LettersArray[i]);
}

Upvotes: 0

putvande
putvande

Reputation: 15213

If it is only going to an array from '2a + 3b + 4a + 5c' to 'a, b, a, c' you can make it a lot shorter:

var expression = '2a + 3b + 4a + 5c';
expression.replace(/(\d+|\s+)/gi,'').split('+');

Upvotes: 1

Related Questions