Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/440.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 用reduce方法处理数组元素_Javascript_Arrays - Fatal编程技术网

Javascript 用reduce方法处理数组元素

Javascript 用reduce方法处理数组元素,javascript,arrays,Javascript,Arrays,我有这个数组finalArr=[12,+,4,-,8,*,2]我想将数组简化为单个值,如下所示:var result=12+4-8*2 以下是我所做的: var operators = {'+' : function (a,b) {return a + b}, '-' : function (a,b){return a - b}, '*' : function (a,b){return a * b},

我有这个数组
finalArr=[12,+,4,-,8,*,2]我想将数组简化为单个值,如下所示:
var result=12+4-8*2

以下是我所做的:

var operators = {'+' : function (a,b) {return a + b},
                 '-' : function (a,b){return a - b},
                 '*' : function (a,b){return a * b},
                 '/' : function (a,b){return a / b}};

var opSymbols = ['+','-','*','/'];
finalArr = [12,+,4,-,8,*,2];
finalArr.reduce(function (acc,next,index,arr){
        for (var m = 0; m < opSymbols.length; m++) {
            var op = '';
            if (opSymbols[m] === arr[1]) {
                op = opSymbols[m];
                acc = operators[op](arr[0],arr[2]);
            }
            if (index > 1 && opSymbols[m] === arr[index]) {
                op = opSymbols[m];
                acc +=  arr[index+1];
            }
        }

        return  acc;
    });
var操作符={'+':函数(a,b){返回a+b},
'-':函数(a,b){返回a-b},
'*':函数(a,b){返回a*b},
“/”:函数(a,b){返回a/b};
变量操作符号=['+'、'-'、'*'、'/'];
最终值=[12,+,4,-,8,*,2];
最终减少(功能(acc、next、index、arr){
对于(var m=0;m1&&opSymbols[m]==arr[index]){
op=操作符号[m];
acc+=arr[指数+1];
}
}
返回acc;
});

我在finalArr.reduce行(SyntaxError:expected expression,get',')中遇到语法错误,我认为我没有正确执行reduce方法。有什么帮助吗?谢谢

运算符是字符串,因此您需要引用它们:

finalArr = [12,'+',4,'-',8,'*',2];

运算符是字符串,因此需要引用它们:

finalArr = [12,'+',4,'-',8,'*',2];

但如果您想测试它:

finalArr=[12',+',4',-',8',*',2];
console.log(
评估(最终联接(“”))
)

但如果您想测试它:

finalArr=[12',+',4',-',8',*',2];
console.log(
评估(最终联接(“”))

)
如果您的数组是混合字符串/int-like的数组

var finalArr = [12,'+',4,'-',8,'*',2];
您可以通过以下命令生成预期结果

var result = finalArr.join('');
如果你需要计算结果

var final = eval(result);

希望对你有帮助;)

如果您的数组是一个混合字符串/int-like的数组

var finalArr = [12,'+',4,'-',8,'*',2];
您可以通过以下命令生成预期结果

var result = finalArr.join('');
如果你需要计算结果

var final = eval(result);

希望对你有帮助;)

没有
reduce
eval
但具有运算符优先级的解决方案

函数计算(a){
而(a.长度>1){
优先级。一些(函数(b){
返回a.some(函数(c,i){
如果(b==c){
返回运算符[b](a,i);
}
});
});
}
返回[0];
}
var运算符={
“+”:函数(a,i){
a[i-1]+=a.拼接(i,2)[1];
返回true;
},
“-”:函数(a,i){
a[i-1]=a.拼接(i,2)[1];
返回true;
},
“*”:函数(a,i){
a[i-1]*=a.拼接(i,2)[1];
返回true;
},
“(”:函数(a,i){
var j=i+1,b;
而(jlog(计算([7',*',8',-',3.5',*',4]);
没有
reduce
eval的解决方案,但具有运算符优先级

函数计算(a){
而(a.长度>1){
优先级。一些(函数(b){
返回a.some(函数(c,i){
如果(b==c){
返回运算符[b](a,i);
}
});
});
}
返回[0];
}
var运算符={
“+”:函数(a,i){
a[i-1]+=a.拼接(i,2)[1];
返回true;
},
“-”:函数(a,i){
a[i-1]=a.拼接(i,2)[1];
返回true;
},
“*”:函数(a,i){
a[i-1]*=a.拼接(i,2)[1];
返回true;
},
“(”:函数(a,i){
var j=i+1,b;
而(jlog(计算([7',*',8',-',3.5',*',4]);
如果您确实想使用reduce而不使用eval

var opSymbols = ['+','-','*','/'];
var finalArr = [12,'+',4,'-',8,'*',2];
var result = finalArr.reduce(function (previousValue,currentValue,currentIndex,array){
    var res;
    var opr;
    if(typeof currentValue == 'number') {
            switch(previousValue.operator){
                case '+':
                    res = previousValue.value + currentValue;break;
                case '-':
                    res = previousValue.value - currentValue;break;
                case '*':
                    res = previousValue.value * currentValue; break;
                case '/':
                    res = previousValue.value / currentValue; break;
            }
            opr = previousValue.operator;
    }

    else if(typeof currentValue == 'string') {
        res = previousValue.value;
        opr = currentValue;
    }

    return {'value':res,'operator': opr};



},{'value':0,'operator':'+'});

console.log(result.value); // this gives 16

如果你真的想使用reduce而不是eval

var opSymbols = ['+','-','*','/'];
var finalArr = [12,'+',4,'-',8,'*',2];
var result = finalArr.reduce(function (previousValue,currentValue,currentIndex,array){
    var res;
    var opr;
    if(typeof currentValue == 'number') {
            switch(previousValue.operator){
                case '+':
                    res = previousValue.value + currentValue;break;
                case '-':
                    res = previousValue.value - currentValue;break;
                case '*':
                    res = previousValue.value * currentValue; break;
                case '/':
                    res = previousValue.value / currentValue; break;
            }
            opr = previousValue.operator;
    }

    else if(typeof currentValue == 'string') {
        res = previousValue.value;
        opr = currentValue;
    }

    return {'value':res,'operator': opr};



},{'value':0,'operator':'+'});

console.log(result.value); // this gives 16

因此,结果应该是一个字符串,或者是值16(如果考虑到运算符优先级,也可以是零)。请注意,使用Robby的fix,您将得到结果16;但是,从数学上讲,由于运算顺序的原因,情况更加复杂。数学结果应该是0,因为12+4-8*2是(12+4)-(8*2),而不是(12+4-8)*2.@T.J.Crowder假设这是计算器程序的一部分,因此a+b*c应为c*(a+b),因此结果应为字符串或值16(如果考虑运算符优先级,则为零)注意,通过Robby的修正,您将得到结果16;但是,从数学上讲,由于运算顺序的原因,事情更加复杂。数学结果应该是0,因为12+4-8*2是(12+4)-(8*2),而不是(12+4-8)*2。@T.J.Crowder这是一个计算器程序的一部分,所以a+b*c应该是c*(a+b)