Моя цель - сообщить функции 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);
Несколько моментов:
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);
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
.