【问题标题】:Recursive Function not working correctly递归函数无法正常工作
【发布时间】:2016-01-21 02:12:57
【问题描述】:

我有一个递归函数,它应该循环一个 json 对象并输出表达式。但是,我的回避似乎已经关闭,因为它在输出 field1 != '' AND field3 == '' 时应该输出 field1 != '' AND field2 == '' AND field3 == ''

我尝试了几种不同的方法,唯一能让它工作的方法是创建一个全局变量outstring,而不是将其传递给函数。我去哪儿了?当我单步执行时,我看到了正确的结果,但是一旦堆栈反转,它就会开始重置outstring,然后再次将其堆叠起来,但会忽略中间(字段2)。

JSFiddle

function buildString(json, outstring) {
        var andor = json.condition;
    for (var rule in json.rules) {
        if (json.rules[rule].hasOwnProperty("condition")) {
            buildString(json.rules[rule], outstring);
        } else {
            var field = json.rules[rule].id;
            var operator = json.rules[rule].operator;
            var value = json.rules[rule].value == null ? '' : json.rules[rule].value;
            outstring += field + ' ' + operator + ' ' + value;
            if (rule < json.rules.length - 1) {
                outstring += ' ' + andor + ' ';
            }
        }
    }
    return outstring;
}

var jsonObj = {"condition":"AND","rules":[{"id":"field1","operator":"!= ''","value":null},{"condition":"AND","rules":[{"id":"field2","operator":"== ''","value":null}]},{"id":"field3","operator":"== ''","value":null}]};

$('#mydiv').text(buildString(jsonObj, ""));

【问题讨论】:

    标签: javascript jquery recursion


    【解决方案1】:

    函数返回一个字符串。

    当你从自身内部递归调用函数时,你不会对该实例返回的字符串做任何事情,只是调用无处可返回的函数

    变化:

        if (json.rules[rule].hasOwnProperty("condition")) {
           buildString(json.rules[rule], outstring);
        } 
    

        if (json.rules[rule].hasOwnProperty("condition")) {
           // include the returned value in concatenated string
           outstring += buildString(json.rules[rule], outstring);
        }
    

    DEMO

    【讨论】:

    • 其实是outstring = buildString(json.rules[rule], outstring)outstring += buildString(json.rules[rule], "")
    【解决方案2】:

    为什么这么复杂?

    function buildString(obj) {
        return "condition" in obj?
            obj.rules.map(buildString).join(" " + obj.condition + " "):
            obj.id + " " + obj.operator + " " + string(obj.value);
    }
    
    //this problem occurs quite often, write a utility-function.
    function string(v){ return v == null? "": String(v) }
    

    【讨论】:

      猜你喜欢
      • 2016-06-16
      • 2022-01-19
      • 2015-11-11
      • 2018-06-17
      • 2022-12-24
      • 2017-08-11
      • 2019-04-04
      • 2023-03-22
      • 2021-10-23
      相关资源
      最近更新 更多