首页 > 解决方案 > 递归 JSON 字符串解析器

问题描述

我在解析 JSON 字符串时需要帮助,但无法完全解决问题所在。

value = 0;

function calc(string) {
    let x = JSON.parse(string);
    var y;


    if (x.expr != undefined){
         y = JSON.stringify(x.expr);
    }
    else {
         y = x;
    }
    if (y.op == 'add') {
        return value = value + y.number;
    }
    else if (y.op == 'subtract') {
        return value = value - y.number;
    }
    x.expr = y;
    calc(y);

};

//console.log(calc('{"op" : "add", "number" : 5}' )); //expected value 5
//console.log(calc('{"op" : "subtract", "number" : 2}' )); //expected value 3
//console.log(calc('{"op" : "add", "number" : 19}' )); //expected value 22
console.log(calc('{"op": "subtract", "expr" : {"op" : "add", "number" : 15}}' )); //expected value 0
//console.log(calc('{"op": "add", "expr" : {"op" : "add", "expr" : {"op" : "subtract", "number" : 3}}}' )); //expected value 0

我已取消注释我要调试的部分。我对递归不是很好,我正在尝试读取 JSON 字符串来计算一个数字。

嵌入的表达式对我来说是新事物,所以我不确定如何进行,即基本情况是什么?

请帮我!

标签: javascriptjsonrecursion

解决方案


JSON.parsereviver 参数可用于以反向级别顺序遍历所有值:

var value = 0;

function calc(string) {
    var number;

    JSON.parse(string, function(key, val) {
        if (val.op) { 
            if ('number' in val)
                number = val.number;

            if (val.op === 'add')
                console.log(value, '+', number, '=', value += number, '\t', JSON.stringify(val));
            else
                console.log(value, '-', number, '=', value -= number, '\t', JSON.stringify(val));
        }
        return val;
    });
};

calc( '{"op": "subtract", "expr" : {"op" : "add", "number" : 15}}' );
calc( '{"op": "add", "expr" : {"op" : "add", "expr" : {"op" : "subtract", "number" : 3}}}' );


推荐阅读