2016-04-04 1 views
0

У меня есть вопрос относительно отображения пути из дерева, в зависимости от величины листа, например, у меня есть следующие JSON:Как отобразить конкретный путь из дерева JSON в зависимости от значений листьев?

{ 
    "children": 
    [ 
    { 
     "children": 
     [ 
     { 
      "name": "Predict Conversion" 
     } 
     ], 
     "name": "Browser ID in {1}" 
    }, 
    { 
     "children": 
     [ 
     { 
      "name": "Predict Click" 
     } 
     ], 
     "name": "Browser ID not in {1}" 
    } 
    ], 
    "name": "Device Type ID in {1,3,4}" 
} 

Я хочу, чтобы отобразить только полный путь, ведущий к листу с value = "Predict Conversion"

+2

не могли бы вы уточнить свой вопрос, потому что я не понимаю, что зависит от значения листьев здесь ...? – n00dl3

+0

Вы ожидаете выхода типа 'children [0] .children [0] .name'? – sabithpocker

+0

@ n00dl3 Я разбираю вывод, чтобы создать визуализацию с помощью D3.JS Итак, для моего примера здесь я хочу сохранить: «имя»: «Идентификатор типа устройства в {1,3,4}» «имя» : «Идентификатор браузера в {1}» «имя»: «Предсказать конверсию» – RoyaumeIX

ответ

1

Вы можете использовать рекурсию для контура над объектом. Используйте Array.isArray для проверки, если значение имеет тип Array и typeof(obj)==="object" для объекта.

Примечание: typeof(obj) возвратит object как для Array и Object

function searchInObj(obj, value, result) { 
 
    
 
    // check for array and call for every item 
 
    if (Array.isArray(obj)) { 
 
    
 
    // primary flag for array. 
 
    var r = false; 
 
    obj.forEach(function(item, index) { 
 
     
 
     // temporary flag for every iteration. 
 
     var _r = searchInObj(item, value, result); 
 
     if (_r) result.push(index) 
 
     
 
     // if one of element returned true, array should return true. 
 
     r = _r || r; 
 
    }); 
 
    return r; 
 
    } 
 
    
 
    // If Object, loop over properties 
 
    else if (typeof(obj) === "object") { 
 
    for (var k in obj) { 
 
     
 
     // If object, check if property is Object/Array and call self. 
 
     if (typeof(obj[k]) === "object") { 
 
     var r = searchInObj(obj[k], value, result); 
 
     if (r) result.push(k); 
 
     return r; 
 
     } 
 
     
 
     // If property is not Array/Object, match value 
 
     else if (obj[k] === value) { 
 
     result.push(k); 
 
     return true; 
 
     } 
 
     // If no match, return false 
 
     else { 
 
     return false; 
 
     } 
 
    } 
 
    } 
 
} 
 

 
var data = { 
 
    "children": [{ 
 
    "children": [{ 
 
     "name": "Predict Conversion" 
 
    }], 
 
    "name": "Browser ID in {1}" 
 
    }, { 
 
    "children": [{ 
 
     "name": "Predict Click" 
 
    }], 
 
    "name": "Browser ID not in {1}" 
 
    }], 
 
    "name": "Device Type ID in {1,3,4}" 
 
} 
 

 
var result = [] 
 
searchInObj(data, "Predict Conversion", result); 
 
document.write("<pre>" + JSON.stringify(result.reverse(), 0, 4) + "</pre>");

Примечание: Для малых JSON это будет работать, но если ваш JSON очень долго, это может быть очень дорогая операция.

0

Вы можете использовать рекурсию для этого.

Быстрый пример

var tree = { 
"children": [{ 
    "children": [{ 
     "name": "Predict Conversion" 
    }], 
    "name": "Browser ID in {1}" 
}, { 
    "children": [{ 
     "name": "Predict Click" 
    }], 
    "name": "Browser ID not in {1}" 
}], 
"name": "Device Type ID in {1,3,4}" 
}; 

console.debug(tree); 

function getPath(node, value){ 
    if(typeof node.children !== "undefined" && node.children !== null){ 
    for(var index in node.children){ 
     var name = getPath(node.children[index], value); 
     if(name) { 
     return node.name+"."+name; 
     } 
    } 
    } else { 
     if(node.name === value){ 
     return node.name; 
     } 
     return false; 
    } 
} 

console.log(getPath(tree, "Predict Conversion")) 

Работа пример в этом fiddle

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