0

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

我尝试使用以下代码来执行此操作:

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

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

4

5 回答 5

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']
于 2013-08-23T16:52:19.290 回答
1

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

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

在你的循环中也有同样的问题

此代码有效

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

这是一个演示小提琴

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

于 2013-08-23T16:48:07.367 回答
1

如果它只是从一个数组'2a + 3b + 4a + 5c''a, b, a, c'你可以使它更短:

var expression = '2a + 3b + 4a + 5c';
expression.replace(/(\d+|\s+)/gi,'').split('+');
于 2013-08-23T16:51:07.230 回答
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.
于 2013-08-23T17:10:20.473 回答
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]);
}
于 2013-08-23T16:51:52.800 回答