2015-06-25 2 views
0

Json Объект:Traverse объектов и построить дерево Lineage

var json = { 
    "Tree": [{ 
     "Title": "Condition", 
     "Attr": { 
      "Id": 2258, 
      "Zone": null 
     }, 
     "Children": [{ 
      "Title": "General Wellness", 
      "Attr": { 
       "Id": 2315, 
       "Zone": null 
      }, 
      "Children": [{ 
       "Title": "Family Health", 
       "Attr": { 
        "Id": 2262, 
        "Zone": null 
       }, 
       "Children": [] 
      }, { 
       "Title": "Healthy Home", 
       "Attr": { 
        "Id": 2316, 
        "Zone": null 
       }, 
       "Children": [] 
      }, { 
       "Title": "Vitamins", 
       "Attr": { 
        "Id": 2317, 
        "Zone": null 
       }, 
       "Children": [] 
      }, { 
       "Title": "Recipes", 
       "Attr": { 
        "Id": 2318, 
        "Zone": null 
       }, 
       "Children": [] 
      }, { 
       "Title": "Caregiving", 
       "Attr": { 
        "Id": 2325, 
        "Zone": null 
       }, 
       "Children": [] 
      }, { 
       "Title": "Healthy Eating", 
       "Attr": { 
        "Id": 2346, 
        "Zone": null 
       }, 
       "Children": [] 
      }, { 
       "Title": "Travel Health", 
       "Attr": { 
        "Id": 2347, 
        "Zone": null 
       }, 
       "Children": [] 
      }] 
     }] 
    }] 
} 

Я могу пройти через дерево, однако я не могу построить древовидную структуру, например, если я хочу, чтобы искать «Рецепты» он должен вернуть мне результат как:

Состояние> Общие> Рецепты Wellness

UPDATE:

Перемещение осуществляется с помощью:

function process(key,value) { 
    alert(key + " : "+value); 
} 

function traverse(o,func) { 
    for (var i in o) { 
     func.apply(this,[i,o[i]]); 
     if (o[i] !== null && typeof(o[i])=="object") {    
      traverse(o[i],func); 
     } 
    } 
} 

traverse(json,process); 
+0

JSON недействителен http://jsonlint.com/ проверить здесь. – Rhea

+0

@ depperm добавлена ​​логика обхода –

+0

@ Rhea исправил Json –

ответ

0

Я предлагаю итеративный, как и раньше, подход с определенным выходом, если он найден, и повторный вызов, если он не найден. Путь создается, если цель найдена.

Бонус: getPath возвращает успех поиска.

function getPath(array, target, path) { 
 
    return array.some(function (a) { 
 
     if (a.Title === target) { 
 
      return path.unshift(a.Title); 
 
     } else if (Array.isArray(a.Children)) { 
 
      return getPath(a.Children, target, path) && path.unshift(a.Title); 
 
     } 
 
    }); 
 
} 
 

 
var data = { 
 
     "Tree": [{ 
 
      "Title": "Condition", 
 
      "Attr": { 
 
       "Id": 2258, 
 
       "Zone": null 
 
      }, 
 
      "Children": [{ 
 
       "Title": "General Wellness", 
 
       "Attr": { 
 
        "Id": 2315, 
 
        "Zone": null 
 
       }, 
 
       "Children": [{ 
 
        "Title": "Family Health", 
 
        "Attr": { 
 
         "Id": 2262, 
 
         "Zone": null 
 
        }, 
 
        "Children": [] 
 
       }, { 
 
        "Title": "Healthy Home", 
 
        "Attr": { 
 
         "Id": 2316, 
 
         "Zone": null 
 
        }, 
 
        "Children": [] 
 
       }, { 
 
        "Title": "Vitamins", 
 
        "Attr": { 
 
         "Id": 2317, 
 
         "Zone": null 
 
        }, 
 
        "Children": [] 
 
       }, { 
 
        "Title": "Recipes", 
 
        "Attr": { 
 
         "Id": 2318, 
 
         "Zone": null 
 
        }, 
 
        "Children": [] 
 
       }, { 
 
        "Title": "Caregiving", 
 
        "Attr": { 
 
         "Id": 2325, 
 
         "Zone": null 
 
        }, 
 
        "Children": [] 
 
       }, { 
 
        "Title": "Healthy Eating", 
 
        "Attr": { 
 
         "Id": 2346, 
 
         "Zone": null 
 
        }, 
 
        "Children": [] 
 
       }, { 
 
        "Title": "Travel Health", 
 
        "Attr": { 
 
         "Id": 2347, 
 
         "Zone": null 
 
        }, 
 
        "Children": [] 
 
       }] 
 
      }] 
 
     }, { 
 
      Title: 'abc', 
 
      Children: [{ 
 
       Title: 'def', 
 
       Children: [{ 
 
        Title: 'ghi' 
 
       }] 
 
      }, { 
 
       Title: 'jkl', 
 
       Children: [{ 
 
        Title: 'mno' 
 
       }] 
 
      }] 
 
     }] 
 
    }, 
 
    path = []; 
 
document.write(getPath(data.Tree, 'Recipes', path) + ': ' + path.join(' &gt; ') + '<br>'); 
 
path = []; 
 
document.write(getPath(data.Tree, 'ghi', path) + ': ' + path.join(' &gt; ') + '<br>'); 
 
path = []; 
 
document.write(getPath(data.Tree, 'nonsense', path) + ': ' + path.join(' &gt; ') + '<br>');

Смежные вопросы