Aleksandar Ivanov
Aleksandar Ivanov

Reputation: 317

An array of numbers and an array of math symbols into a math expression?

I would like to turn this:

let nums = [1, 2, 3];
let syms = ["+", "*"];
let result;

Into a math expression:

result = 1 + 2 * 3;
console.log(result); // 7

Without using eval(), because it returns weird stuff like i.e. "6.3 + 0.6" = 6.8999999999999995

Upvotes: 0

Views: 215

Answers (1)

Most bug free answer so far......

var nums=[1,0],syms=['/']
const rulesyms = ['/','*'];  //do not change sequence of this one.
var res, count=0,power=0;

solve_nonsumoperator().then(()=>{
    summing().then(()=>{
        console.log(nums[nums.length-1])
    })
})

function getnums(j,operator){
    power=0
    if(Math.floor(nums[j])!=nums[j])
        power=nums[j].toString().split('.')[1].length
    else{         //if not a float then forcing float point
        nums[j]=nums[j].toFixed(1)
        power=1
    }
    if(Math.floor(nums[j+1])!=nums[j+1]){
        if(power<nums[j+1].toString().split('.')[1].length){
            power=nums[j+1].toString().split('.')[1].length
        }
    }
    else{
        nums[j+1]=nums[j+1].toFixed(1)
        if(power<1)
            power=1
    }
    //adding decimal 0s to match floating point 
    for(let i = nums[j].toString().split('.')[1].length;i<power;i++)
        nums[j]=nums[j].toString()+'0'
    for(let i = nums[j+1].toString().split('.')[1].length;i<power;i++)
        nums[j+1]=nums[j+1].toString()+'0'
    nums[j]=parseInt(nums[j].toString().split('.').join(''),10)
    nums[j+1]=parseInt(nums[j+1].toString().split('.').join(''),10)
    switch(operator){
        case '/':res=nums[j]/nums[j+1]
                 break;
        case '*':res=nums[j]*nums[j+1]/Math.pow(10,2*power)
                 break;
        default:if(operator==='+')
                    res=(nums[j]+nums[j+1])/Math.pow(10,power)
                else if(operator==='-')
                    res=(nums[j]-nums[j+1])/Math.pow(10,power)
                 break;
    }
}

function redundant(j){
    nums[j+1]=res //replacing the result into array position
    for(var k = j;k>0;k--){
    //loop to replace the used nums, syms to begin of array
        nums[k]=nums[k-1]
        syms[k]=syms[k-1]  
    }
    syms[count]='$' //has to be below for loop
    count++
}

function summing(){
    syms.forEach((g,j)=>{
        if(g==='+'||g==='-'){
            getnums(j,g)
            redundant(j)                  
        }    
    })
    return Promise.resolve()
}

function solve_nonsumoperator(){
    rulesyms.forEach(f=>{
        syms.forEach((g,j)=>{
            if(g===f){
                getnums(j,f)
                redundant(j)
            }    
        })
    })
    return Promise.resolve()
}

Upvotes: 1

Related Questions