我正在构建一个计算器,并从输入中获取以下数组['1','2','+','5','4']
,我想将这些数字过滤到[12,'+',54]
中。
我将如何使用javascript?
这是我尝试的方法,但是此方法仅过滤出单数,而我需要整个数字。
更新:我想将运算符也保留在数组中。我该如何修复正则表达式?
let numbers = [];
input.forEach(el => {
if(!isNaN(parseFloat(el) && !isFinite(parseFloat(el))){
numbers.push(el);
}
})
答案 0 :(得分:1)
您可以join
将数组split
成单个字符串,然后对任意非数字([^0-9]
)字符使用RegEx来.map(n=>+n)
。由于输出将是字符串,因此您需要const arr = ['1', '2', '+', '5', '4', '-', '8'];
const result = arr.join('').split(/[^0-9]/).map(n => +n);
console.log(result);
才能将它们转换为整数。
+n || n
更新:我想将运算符也保留在数组中。我该如何修复正则表达式?
与上述相同,只是将正则表达式包装在括号中以形成捕获组。您还需要对int(const arr = ['1', '2', '+', '5', '4', '-', '8'];
const result = arr.join('').split(/([^0-9])/).map(n => +n || n);
console.log(result);
)进行条件检查,因为该数组现在具有字符串。
createMuiTheme
答案 1 :(得分:0)
具有以下任意数量的+
和-
运算符的示例calc解释器已从下面链接中给出的python转换为JS代码。您可以修改它并构建其余部分。
目前有
+
和-
操作员支持。1+2+3-20 ...
22 + 35
或200 +340
等它没有的东西
*
和/
const INTEGER = 'INTEGER'
const PLUS = 'PLUS'
const MINUS = 'MINUS'
const EOF = 'EOF'
class Token {
// class methods
constructor(type, value) {
// token type: INTEGER, PLUS, MINUS, or EOF
this.type = type
// token value: non-negative integer value, '+', '-', or None
this.value = value
}
tokenRep() {
return {type: this.type, value: this.value}
}
}
class Interpreter{
constructor(text) {
// client string input, e.g. "3 + 5", "12 - 5", etc
this.text = text
//this.pos is an index into this.text
this.pos = 0
//current token instance
this.current_token = ''
this.current_char = this.text[this.pos]
}
error() {
throw new Error('Error parsing input');
}
advance() {
//Advance the 'pos' pointer and set the 'current_char' variable."""
this.pos += 1
if (this.pos > this.text.length - 1){
this.current_char = '' // Indicates end of input
} else {
this.current_char = this.text[this.pos]
}
}
skip_whitespace() {
while(this.current_char != '' && this.current_char == ' ') {
this.advance()
}
}
integer(){
//Return a (multidigit) integer consumed from the input."""
let result = ''
while(this.current_char != '' && ! isNaN(this.current_char)){
result += this.current_char
this.advance()
}
return parseInt(result)
}
get_next_token(){
//Lexical analyzer (also known as scanner or tokenizer)
// This method is responsible for breaking a sentence
//apart into tokens.
//"""
while( this.current_char != ''){
if(this.current_char == ' '){
this.skip_whitespace()
continue
}
if(!isNaN(this.current_char)){
return new Token(INTEGER, this.integer())
}
if(this.current_char == '+'){
this.advance()
return new Token(PLUS, '+')
}
if(this.current_char == '-'){
this.advance()
return new Token(MINUS, '-')
}
this.error()
}
return new Token(EOF, null)
}
eat(token_type) {
// compare the current token type with the passed token
// type and if they match then "eat" the current token
// and assign the next token to the this.current_token,
// otherwise raise an exception.
if(this.current_token.type == token_type){
this.current_token = this.get_next_token()
}
else{
this.error()
}
}
term() {
//Return an INTEGER token value."""
let token = this.current_token
this.eat(INTEGER)
return token.value
}
expr() {
//Parser / Interpreter
//expr -> INTEGER PLUS INTEGER
//expr -> INTEGER MINUS INTEGER
//
// set current token to the first token taken from the input
this.current_token = this.get_next_token()
let result = this.term()
while([PLUS, MINUS].includes(this.current_token.type)){
let token = this.current_token
if(token.type == PLUS){
this.eat(PLUS)
result = result + this.term()
} else if (token.type == MINUS) {
this.eat(MINUS)
result = result - this.term()
}
}
return result
}
}
let input = '12+ 54'
interpreter = new Interpreter(input)
result = interpreter.expr()
console.log(input + ' = ' +result)
input = '10+5-30'
interpreter = new Interpreter(input)
result = interpreter.expr()
console.log(input + ' = ' +result)
input = '12+54+600'
interpreter = new Interpreter(input)
result = interpreter.expr()
console.log(input + ' = ' +result)
如果您要构建功能全面的计算器解释器,我强烈建议您阅读本文。没有数组过滤 或解析可能无法正常工作,则需要创建令牌并对其进行解析 因此,只有您才能构建功能全面的计算器 可以处理任何类型的输入。
答案 2 :(得分:0)
一种方法是join
并使用match
let arr = ['1','2','+','5','4']
let giveMeDigits = (arr) =>{
return arr.join('').match(/\d+/g).map(e=> +e)
}
console.log(giveMeDigits(arr))