2013-08-23 231 views
0

我想从JavaScript中动态创建另一个数组。 我有一个字符串,这是一个数学文字表达式,就像这个'2a + 3b + 4a + 5c':我只是想将它拆分成只有数字的文字部分的数组(例如'a,b,a, C')。JavaScript:动态创建数组

我试着用下面的代码来做到这一点:

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 + ']')); 
} 

但它不工作! 我该如何解决它?

+2

你在第一个'alert'中有语法错误,撇号需要转义。 – Jasper

+0

它是复制粘贴错误,还是你的提醒实际上是这样的引号?因为这会导致语法错误(“it's”的撇号正在结束字符串)。另外,你为什么使用eval? – Chad

+0

SO代码荧光笔已经提供了答案。 – mishik

回答

1

您的警报中的字符串中断。它应该是

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

也是在你的循环同一个问题的eval有

此代码的工作

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]); 
} 

这里是一个demo fiddle

也尽量避免eval的地方你不需要它。

1

如果只是将一个数组从'2a + 3b + 4a + 5c''a, b, a, c'你可以把它短了很多:

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

不知道为什么你正在使用eval。试试这个:

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]); 
} 
5

很多错误的这里,试图发表评论我所有的修复:

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]); 
} 

工作例如:http://jsfiddle.net/FERj5/

来完成同样的事情,更快捷的方法是:

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

哇!谢谢你们!我无法想象正则表达式的力量!我会非常仔细地研究它们!再次感谢! –

0

这需要多大的灵活性?如果你的模式总是将是[number][letter] + [number][letter] + [number][letter] + [number][letter] + ....,那么你可以去真正的基本:

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 */ 

对于一个小更灵活,所有你需要做的是改变了正则表达式一点点:

  • 如果您需要考虑多字母变量,则可以将 /[a-z]/g更改为/[a-z]+/g
  • 如果您需要考虑大写变量,则可以将/[a-z]/g更改为/[a-z]+/gi