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'配列 from toだけに行く場合は'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 に答える