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
Javascript 如何编写条件语句以避免在React/Redux计算器中重复某些值?_Javascript_Reactjs_Redux_React Redux_Calculator - Fatal编程技术网

Javascript 如何编写条件语句以避免在React/Redux计算器中重复某些值?

Javascript 如何编写条件语句以避免在React/Redux计算器中重复某些值?,javascript,reactjs,redux,react-redux,calculator,Javascript,Reactjs,Redux,React Redux,Calculator,这是针对freecodecamp.orgReact/Redux项目的 我正在编写一个计算器,我通过了除11和13之外的所有测试 以下是我需要通过的该项目测试的链接: 以下是我的代码中我无法正确理解的部分: const calcReducer = (state = calcState, action) => { switch(action.type) { case 'ADD': return{ ...state, value: sta

这是针对freecodecamp.orgReact/Redux项目的


我正在编写一个计算器,我通过了除11和13之外的所有测试

以下是我需要通过的该项目测试的链接:

以下是我的代码中我无法正确理解的部分:

const calcReducer = (state = calcState, action) => {
  switch(action.type) {
    case 'ADD':
      return{
        ...state,
        value: state.value == 0 ? action.text : state.value + action.text
        }
    case 'OPERATOR': ***//this part is what I think is wrong. Everything else functions how it should***
      return{
        ...state,
        value: action.text == regex + regex ? action.text - regex : state.value = action.text
        }
在任何人询问之前,我的正则表达式已经设置好并通过控制台正确记录

我很感激能在这件事上得到的任何帮助


谢谢

您正在该三元运算符中变异redux状态:

value:action.text==regex+regex?action.text-regex:state.value=action.text

这里的最后一部分:
state.value=action.text
是变异状态

尝试将其更改为:

value:action.text==regex+regex?action.text-正则表达式:action.text

还有这里的
'ADD'
三元:

value:state.value==0?action.text:state.value+action.text

这是不需要的。您可以将其缩短为:


value:state.value+action.text

我通过使用条件语句和三元表达式的组合解决了这个问题。我编写了一个名为handleOperator的函数,并使用三元表达式将“action.text”作为开关大小写“OPERATOR”中的参数传递,该表达式不允许将其他运算符附加到“state.value”中,不包括负号

以下是我的功能和开关盒代码:

  var input = document.getElementById('display').value;
  var inpArr = [];
  if (endsWithNegativeSign.test(input) == true && isOperator.test(value)) {
    input = input.replace(isOperator, value);
    return input.replace(value, '');
  }
  return false;
}
const handleOperator = (value) => {
  var input = document.getElementById('display').value;
  if (endsWithOperator.test(input) == true) {
    return input.replace(lastChar, value);
  }
  return false;
}


//Setup Reducer
const calcReducer = (state = calcState, action) => {
  switch(action.type) {
    case 'ADD':
      return{
        ...state,
        value: (state.value == 0) ? action.text : state.value + action.text
      }
    case 'OPERATOR':
      return{
        ...state,
        value: endsWithOperator.test(state.value) == true && action.text != '-' ? handleOperator(action.text) : endsWithNegativeSign.test(state.value) == true ? handleNegative(action.text) : containsDecimal.test(state.value) == true ? handleDecimal(action.text) : state.value + action.text```

我试过你的建议,但似乎仍然不起作用。可能是因为“ADD”的情况也会改变状态吗?不,你的“ADD”情况不会改变状态,但是三元结构是不必要的。我编辑了我的答案以反映这一点。尝试记录您的redux状态,并检查每个操作发生了什么,以了解为什么它不起作用。它可能是您的regexI编写的regex只匹配符号,它确实匹配。我的控制台中没有任何错误。我的调试技巧有些生疏,但我也看不出我的案例有什么问题。“添加”案例必须按照我的方式进行,否则它将为所有内容预先设置一个零,而不是显示零,并在有人单击其他按钮时使其消失。这是我必须通过的测试的一部分。这里有一个指向整个测试的链接:如果它在0前面加上前缀,则表示
操作。text
是字符串而不是数字。我会尝试添加
Number(action.text)
,以确保您只添加了数字,而它没有试图连接