Reputation: 11
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
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:
/[a-z]/g
to /[a-z]+/g
./[a-z]/g
to /[a-z]+/gi
.Upvotes: 0
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
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
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
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