2015-10-07 2 views
0

Я пытаюсь выяснить, как получить все значения в объекте JSON отдельно от верхнего уровня. Я знаю, как перебрать все объекты следующим образом:Как получить узлы на определенном уровне в объекте JSON?

for (var key in dirTree) { 
    if(dirTree.hasOwnProperty(key)) { 
     var val = dirTree[key]; 
     console.log(JSON.stringify(val)); 
    } 
    } 

Но как это сделать, что для получения на определенном уровне с вершины?

+0

Вы хотите пройти путь по своим свойствам? – Icepickle

+0

@Icepickle Да. – user1692342

ответ

0

Посредством рекурсии свойств объекта вы можете это сделать. В этом случае мой пример не очень выразителен, он не скажет вам, не нашел ли свойство в вашем пути, он просто вернется не определен для неизвестных путей, но он вернет все, что содержит последнее свойство (как и в моем примере, он должен возвращать «текст»)

Конечно, этот пример не имеет никакого смысла, если строка статична, но если она поступает от пользовательского ввода или от значения, которое вы получаете за пределами своего контроля , вы можете использовать его, в противном случае вы можете просто начать конечно с jsonObject.complex.english.title;)

'use strict;'; 
 

 
var jsonObject = { 
 
    complex: { 
 
    english: { 
 
     title: 'text' 
 
    } 
 
    } 
 
}; 
 

 
/* 
 
* @method getPath 
 
* 
 
* @param obj Object for which a path must be found 
 
* @param path String value indicating the path that will be traversed, joined with . 
 
* 
 
* @returns undefined or the object that was found at the specified path 
 
*/ 
 
function getPath(obj, path) { 
 
    var arrayPath, 
 
     propertyName, 
 
     nextPath; 
 
    console.log('getting path "' + path + '" for', obj); 
 
    if (!obj) { 
 
    // previous evaluation returned null, empty string, false, or undefined 
 
    return; 
 
    } 
 
    if (!path) { 
 
    // no path given, or path is empty string 
 
    return obj; 
 
    } 
 
    arrayPath = path.split('.'); 
 
    propertyName = arrayPath[0]; 
 
    if (!propertyName) { 
 
    // invalid path, return the current object 
 
    return; 
 
    } 
 
    if (arrayPath.length === 1) { 
 
    // no deeper searching required, return the value or undefined in case this object doesn't have the property 
 
    return obj[propertyName]; 
 
    } 
 
    // reassemble the left over string 
 
    nextPath = arrayPath.slice(1, arrayPath.length).join('.'); 
 
    // search the next part of the path 
 
    return getPath(obj[propertyName], nextPath); 
 
} 
 

 
function displayResults(inputSelector, outputSelector) { 
 
    var inputEl = document.querySelectorAll(inputSelector)[0], 
 
     outputEl = document.querySelectorAll(outputSelector)[0]; 
 
    
 
    if (inputEl && outputEl) { 
 
    outputEl.innerHTML = JSON.stringify(getPath(jsonObject, inputEl.value)); 
 
    } 
 
    // no submit ;) 
 
    return false; 
 
} 
 

 
displayResults('#pathField', '#output');
<form onsubmit="return displayResults('#pathField', '#output');"> 
 
    <label for="pathField">Enter the path to find in the object</label> 
 
    <input type="text" required pattern="[\w.|\w]*" id="pathField"> 
 
    <button type="submit">Find and output path</button> 
 
</form> 
 
<div id="output"></div>

0

Да, Icepickle прав. Рекурсия - лучший способ справиться с этим. Вот решение:

var testObj = { 
    "one": { 
    "1": {"msg": "msg1"}, 
    "2": {"msg": "msg2"}, 
    "3": {"msg": "msg3"} 
    }, 
    "two": { 
    "1": {"msg": "msg4"}, 
    "2": {"msg": "msg5"}, 
    "3": {"msg": "msg6"} 
    } 
}; 
function follow(obj, n){ 
    if (n == 1) { 
    return Object.keys(obj).map(function(k){ 
     return obj[k]; 
    }); 
    } 
    else return Object.keys(obj).map(function(k){ 
    return follow(obj[k], n-1); 
    }); 
} 
console.log(follow(testObj, 2)); 

http://jsbin.com/boqekunaba/edit?js,console,output

Как написано, это вернет второй уровень, например JSON дерева. Вы можете изменить n на 3, чтобы узнать, что произойдет. Результатом являются массивы, чтобы сохранить это кратким. Это результат использования метода map, который является ярлыком для записи цикла for. Если мы просто хотим объекты, нам придется немного подкорректировать этот код.