这段代码应该返回'One',我需要将数字转换为单词。为什么没有保存到strEval?
function wordedMath(expr) {
let arrExpr = expr.split(' ');
let arrayOfwords = ['zero', 'one', 'two', 'minus', 'plus'];
let arrayOfnumbers = ['0', '1', '2', '-', '+'];
let strEval = '';
arrExpr.forEach((item, i) => {
let cased = expr.toLowerCase();
if(cased.includes(arrayOfwords)) {
strEval += arrExpr.replace(arrayOfwords[i], arrayOfnumbers[i])
}
});
let result = eval(strEval);
if(result === 1) result = 'One';
if(result === 2) result = 'Two';
if(result === 0) result = 'Zero';
return result;
};
console.log(wordedMath("zero Plus one"))
replace
方法不是修改它所调用的实例,而是返回一个新字符串。因此,您需要以下一种方式修改代码:expr = expr.replace(...
。此外,重写函数属性是一种糟糕的代码风格,我建议使用局部变量。另一个改进是使用包含单词到其数字表示的映射的查找映射(即Object(,这将允许创建一致的第四次反向转换。
首先,代码根本不可扩展,当您需要进行一点扩展时,这是一个大问题。
请试试这个:
const numWords = {
zero: 0,
one: 1,
two: 2,
plus: "+",
minus: "-",
};
function wordedMath(expr) {
const arrToConvert = expr.split(" ");
let strToEval = "";
arrToConvert.forEach((word) => {
const cased = word.toLowerCase();
strToEval += numWords[cased];
});
const result = eval(strToEval);
return result;
}
console.log(wordedMath("zero Plus one")); // the result is 1
为什么这段代码不能按预期工作与您应该得到的错误有很大关系。即Uncaught SyntaxError: Unexpected token
。这样的错误意味着编译器发现了不符合语法的部分代码。考虑到eval
函数将一个给定的字符串作为一段JS代码运行,您的字符串expr
有一些JS的意外标记。如果调试代码,您应该看到eval
后面的expr
的值仍然是"zero Plus one"
。这就是您的代码无法工作的主要原因。
编辑
p.S。在JS中使用eval
是不好的做法。您应该为您的软件考虑一些其他选项。