从数组计算器过滤数字

时间:2019-06-10 04:11:36

标签: javascript

我正在构建一个计算器,并从输入中获取以下数组['1','2','+','5','4'],我想将这些数字过滤到[12,'+',54]中。

我将如何使用javascript?

这是我尝试的方法,但是此方法仅过滤出单数,而我需要整个数字。

更新:我想将运算符也保留在数组中。我该如何修复正则表达式?

let numbers = [];
input.forEach(el => {
    if(!isNaN(parseFloat(el) && !isFinite(parseFloat(el))){
        numbers.push(el);
    }
})

3 个答案:

答案 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. 处理任何输入等1+2+3-20 ...
  4. 处理多位数输入,例如22 + 35200 +340

它没有的东西

  1. 支持*/

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)

  

如果您要构建功能全面的计算器解释器,我强烈建议您阅读本文。没有数组过滤   或解析可能无法正常工作,则需要创建令牌并对其进行解析   因此,只有您才能构建功能全面的计算器   可以处理任何类型的输入。

https://ruslanspivak.com/lsbasi-part1/

答案 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))