如何用js实现一个简单的四则运算计算函数

由 漆黑菌 于 2018年11月28日 发布

别人的版本

考虑了括号,使用了递归,看上去比较靠谱。

    function parse(content){
        //寻找最后一个左括号
        var index = content.lastIndexOf("(");
    
        //如果等式中有左括号
        if(index > -1){
            //寻找右括号,从左括号的位置开始寻找
            var endIndex = content.indexOf(")",index);
    
            //如果等式中有右括号
            if(endIndex > -1){
                //调用自己算出括号中的结果
                var result = parse(content.substring(index + 1,endIndex));
                //然后继续调用自己,
                //其实这里完成的工作就是"2+3+(2+3*2)"转化成了"2+3+8",也就是用括号中的结果替换括号所在位置
                return parse(content.substring(0,index) + ("" + result) + content.substring(endIndex + 1))
            }
        }
    
        index = content.indexOf("+");
    
        if(index > -1){
            return parse(content.substring(0,index)) + parse(content.substring(index + 1));
        }
    
        index = content.lastIndexOf("-");
    
        if(index > -1){
            return parse(content.substring(0,index)) - parse(content.substring(index + 1));
        }
    
        index = content.lastIndexOf("*");
    
        if(index > -1){
            return parse(content.substring(0,index)) * parse(content.substring(index + 1));
        }
    
        index = content.lastIndexOf("/");
    
        if(index > -1){
            return parse(content.substring(0,index)) / parse(content.substring(index + 1));
        }
    
        if("" == content){
            return 0;
        }else{
            return content - 0;
        }
    }

自己实现的版本

基本上是按照人脑计算的思路来的,非常愚蠢用了三次循环,很不优雅。

    function cale(input){
        input = input.toString().trim()
        let inputArr = input.toString().split('')
        let outputArr = []
        let temp = ''
        for (let i = 0;i<inputArr.length;i++){
            if(!isNaN(inputArr[i])){
                temp += inputArr[i]
            } else {
                outputArr.push(temp)
                temp = ''
                outputArr.push(inputArr[i])
            }
            if(i==inputArr.length-1){
                outputArr.push(temp)
                inputArr = outputArr.concat()
                outputArr = []
            }
        }
        for(let i = 0;i<inputArr.length;i++){
            if(inputArr[i+1]=='/') {
                inputArr[i+2] = inputArr[i]/inputArr[i+2]
                inputArr.splice(i,2)
                i-=1
            }
            if(inputArr[i+1]=='*') {
                inputArr[i+2] = inputArr[i]*inputArr[i+2]
                inputArr.splice(i,2)
                i-=1
            }
        }
        for(let i = 0;i<inputArr.length;i++){
            if(inputArr[i+1]=='+') {
                inputArr[i+2] = inputArr[i]/1+inputArr[i+2]/1
                inputArr.splice(i,2)
                i-=1
            }
            if(inputArr[i+1]=='-') {
                inputArr[i+2] = inputArr[i]/1-inputArr[i+2]/1
                inputArr.splice(i,2)
                i-=1
            }
        }
        return Number(inputArr)
    }