1

我的目标是JSON.parse用可选参数告诉函数,如果传递给函数的字符串有一个名为执行该表达式内部操作的键,然后继续向外工作以对字符串的其余部分进行操作reviver argument,我希望它.calc(string)"expr"

每次我运行这个我都会得到NaN

如果我注释掉calc(string)之前的最后两个调用,console.log(initNumber)则程序按预期运行。

因此,如果键是"expr"并且嵌套"op"键的值是"add"然后对该嵌套对象执行 add() 函数。如果"op"key 是"subtract".

非常感谢任何帮助。

var initNum = 0;

var calc = function(string) {
    var calcString = JSON.parse(string, reviver);

    add(calcString);
    subtract(calcString);
};

var add = function(string) {
    if (string["op"] == "add") {
    var numString = parseInt(JSON.stringify(string["number"]));
    initNum = numString + initNum;
    return initNum;
  }
}
var subtract = function(string) {
    if (string["op"] == "subtract") {
    var numString = parseInt(JSON.stringify(string["number"]));
    initNum = initNum - numString;
    return initNum;
  }
}

var reviver = function(key, val) {
  if (key == "expr") {
    if (val.op == "add") {
      return add(val);
    }
    else if (val.op == "subtract") {
      return subtract(val);
    }
  }
    else {
      return val;
    }
};

calc('{"op" : "add", "number" : 5}');
calc('{"op" : "subtract", "number" : 2}');
calc('{"op" : "add", "number" : 19}');
calc('{"op": "subtract", "expr" : {"op" : "add", "number" : 15}}');
calc('{"op": "add", "expr" : {"op" : "add", "expr" : {"op" : "subtract", "number" : 3}}}');
console.log(initNum);
4

1 回答 1

1

几点:

  • reviver会给你已经解析的值,你不需要再次解析它们。
  • 如果您将 anexpr转换为值,您的addandsubtract函数需要能够读取这些值,而不仅仅是number- 我认为,也许您打算使用不同的逻辑。这就是为什么我得到operand下面的方式。无论哪种方式,您都需要意识到可能没有number争论,并处理它。
  • 您得到的原因NaN是由于上述原因-您试图number从没有对象的对象中获取对象(恢复exprs 的结果),这使您undefined破坏了计算。

基本上,记住

{"op": "subtract", "expr" : {"op" : "add", "number" : 15}}

{"op": "subtract", "expr" : 37}

在你恢复表达式之后,你需要处理它。

var initNum = 0;

var calc = function(string) {
    var calcObj = JSON.parse(string, reviver);

    add(calcObj);
    subtract(calcObj);
};

var add = function(obj) {
    if (obj["op"] == "add") {
      var operand = (obj["number"])? obj["number"] : obj["expr"];
      initNum = operand + initNum;
      console.log("running total : "+initNum);
      return initNum;
  }
}
var subtract = function(obj) {
    if (obj["op"] == "subtract") {
      var operand = (obj["number"])? obj["number"] : obj["expr"];
      initNum = initNum - operand;
      console.log("running total : "+initNum);
      return initNum;
  }
}

var reviver = function(key, val) {
  if (key == "expr") {
    if (val.op == "add") {
      return add(val);
    }
    else if (val.op == "subtract") {
      return subtract(val);
    }
  }
    else {
      return val;
    }
};

calc('{"op" : "add", "number" : 5}');
calc('{"op" : "subtract", "number" : 2}');
calc('{"op" : "add", "number" : 19}');
calc('{"op": "subtract", "expr" : {"op" : "add", "number" : 15}}');
calc('{"op": "add", "expr" : {"op" : "add", "expr" : {"op" : "subtract", "number" : 3}}}');
console.log(initNum);

于 2017-10-22T01:01:44.640 回答