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;
而(j log(计算([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;
而(j log(计算([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)