JSON.parse функция возрождения вложенных объектов

1

Моя цель - сообщить функции JSON.parse с необязательным reviver argument JSON.parse который мне бы хотелось, если строка, передаваемая функции calc(string) имеет ключ с именем "expr" для выполнения операции внутри этого выражения, а затем продолжать работать наружу, чтобы работать с остальной частью строки.

Каждый раз, когда я запускаю это, я получаю NaN.

Если я прокомментирую два последних вызова calc(string) перед console.log(initNumber) то программа будет работать, как ожидалось.

Поэтому, если ключ является "expr" а значение вложенного ключа "op" равно "add" тогда выполните функцию add() для этого вложенного объекта. То же самое происходит, если клавиша "op" "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);
Теги:
parsing
reviver-function

1 ответ

1
Лучший ответ

Несколько моментов:

  • reviver даст вам уже разобранные значения, вам не нужно их снова анализировать.
  • если вы конвертируете expr в значение, ваши функции add и subtract должны иметь возможность читать эти значения, а не просто number - я думаю, возможно, вы намерены использовать другую логику. Вот почему я получаю operand так, как я делаю ниже. В любом случае, вам нужно знать, что не может быть аргумент number и обрабатывать это.
  • причина, по которой вы получали NaN объясняется тем, что above- вы пытались получить number от объектов, у которых их не было (результаты оживления expr), что дает вам 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);
  • 0
    большое спасибо. Это делает wayyyyyyy больше смысла сейчас. Итак, в части с операндом var вы теперь говорите: «Если у объекта JSON есть ключ« число », используйте его, в противном случае используйте ключ« expr »». Спасибо Спасибо.
  • 0
    If the JSON object has a "number" key, use that, otherwise use the "expr" key точно If the JSON object has a "number" key, use that, otherwise use the "expr" key Да. И поскольку reviver определена для работы «начиная с самых вложенных свойств и переходя к самому исходному значению», все expr должны быть уже преобразованы в свои значения к тому моменту, когда они будут видны с помощью окружающих их операций add или subtract .
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню