2016-01-21 3 views
2

У меня есть функция recusive, которая должна проходить через объект json и выводить выражение. Тем не менее, мой recusion, кажется, от, потому что он выводит field1! = «» И field3 == «», когда он должен быть вывод field1! = «» И field2 == «» И 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, "")); 

ответ

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

+0

Всегда что-то глупое. Спасибо, сэр. – mwilson

+0

На самом деле это 'outstring = buildString (json.rules [rule], outstring)' или 'outstring + = buildString (json.rules [rule]," ")' – Thomas

0

Почему так сложно?

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) } 
Смежные вопросы