不推荐在外面使用Array.reduce变异状态?

时间:2017-07-06 18:48:31

标签: javascript

为什么C:\dev\Python36-32\python.exe C:/dev/PythonProjects/untitled4/main.py using floats: -1.1703014024533338e-10 using Decimals() w/ prec=19: -4.289200000000001210E-13 using Decimals() w/ prec=500: 0E-700 Process finished with exit code 0 方法之外的变异变量被视为不良做法?在下面的例子中,我正在改变从reduce方法内部声明的变量。为什么不建议这样做?



.reduce()




2 个答案:

答案 0 :(得分:0)

见@JordanRunning评论:

"如果你这样做,为什么还要使用reduce呢?如果您的输出是通过副作用,您也可以使用forEach"

我正要说同样的话。这是一个没有外部依赖的函数版本:



function balanceParens(string) {
	let res = string.split("").reduce((state, char) => {
		// Handle if parens open and close out of order
		if (state.counter < 0) {
			return state;
		}
		// Add 1 for each open in order
		if (char === "(") {
			if (++state.counter > state.max) {
				state.max = state.counter;
			}
			return state;
		}
		// subtract 1 for each close in order
		if (char === ")") {
			state.counter = --state.counter;
			return state;
		}
		// handle use case if char is not a paren
		return state;
	}, {max: 0, counter: 0});
	console.log("Max depth was :", res.max);
	return !res.counter;
}

console.log(balanceParens("((()(((())))))((((()))))"));
&#13;
&#13;
&#13;

答案 1 :(得分:0)

  

为什么.reduce()方法之外的变异变量被认为是不好的做法?

因为您正在将功能与命令式方法混合在一起。保持一个范例,而不是让每个人感到困惑。

你会选择

  • reduce使用纯回调和no side effects

    function step({max: oldMax, counter: oldCounter}, char) {
      const counter = oldCounter + (char=="(") - (char==")");
      const max = counter > oldMax ? counter : oldMax;
      return {max, counter};
    }
    function maxParensLevel(string) {
      assert(hasBalancedParens(string));
      const {max, counter} = string.split("").reduce(step, {max:0, counter:0});
      return max;
    }
    
  • 或一个简单的循环和两个可变变量

    function maxParensLevel(string) {
      assert(hasBalancedParens(string));
      let max = 0;
      let counter = 0;
      for (const char of string.split("")) {
        if (char == "(")
          counter++;
        else if (char == ")")
          counter--;
        if (counter > max)
          max = counter;
      }
      return max;
    }
    

但不是两者。