gpt4 book ai didi

javascript - JSON.parse reviver函数嵌套对象

转载 作者:行者123 更新时间:2023-11-30 21:03:35 26 4
gpt4 key购买 nike

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

每次我运行它时,我都会得到 NaN

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

因此,如果键是 "expr" 并且嵌套的 "op" 键的值是 "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 转换为一个值,您的 addsubtract 函数需要能够读取这些值,而不仅仅是number - 我想,也许您打算使用不同的逻辑。这就是为什么我按照下面的方式获取 operand 的原因。无论哪种方式,您都需要注意可能没有 number 参数,并进行处理。
  • 你得到 NaN 的原因是因为上面的 - 你试图从没有的对象中获取 number (恢复 的结果code>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);

关于javascript - JSON.parse reviver函数嵌套对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46869445/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com