Циклическое перемещение объекта (дерева) рекурсивно
Есть ли способ (в jQuery или JavaScript) перемещаться по каждому объекту, а это дети и внуки и т.д.?
Если так... могу ли я также прочитать их имя?
Пример:
foo :{
bar:'',
child:{
grand:{
greatgrand: {
//and so on
}
}
}
}
поэтому цикл должен сделать что-то вроде этого...
loop start
if(nameof == 'child'){
//do something
}
if(nameof == 'bar'){
//do something
}
if(nameof =='grand'){
//do something
}
loop end
Ответы
Ответ 1
Вы ищете цикл for...in
:
for (var key in foo)
{
if (key == "child")
// do something...
}
Помните, что циклы for...in
будут перебирать все перечислимые свойства, включая те, которые добавлены к прототипу объекта. Чтобы избежать действия над этими свойствами, вы можете использовать метод hasOwnProperty
, чтобы проверить, принадлежит ли свойство только этому объекту:
for (var key in foo)
{
if (!foo.hasOwnProperty(key))
continue; // skip this property
if (key == "child")
// do something...
}
Выполнение цикла рекурсивно может быть таким же простым, как запись рекурсивной функции:
// This function handles arrays and objects
function eachRecursive(obj)
{
for (var k in obj)
{
if (typeof obj[k] == "object" && obj[k] !== null)
eachRecursive(obj[k]);
else
// do something...
}
}
Ответ 2
Если вы хотите вернуть дерево отношений, вы можете использовать Object.keys рекурсивно.
function paths(item) {
function iter(r, p) {
var keys = Object.keys(r);
if (keys.length) {
return keys.forEach(x => iter(r[x], p.concat(x)));
}
result.push([p])
}
var result = [];
iter(item, []);
return result;
}
var data = {
foo: {
bar: '',
child: {
grand: {
greatgrand: {}
}
}
}
}
console.log(paths(data));
Ответ 3
Вы можете иметь рекурсивную функцию со встроенной функцией синтаксического анализа.
function parseObjectProperties (obj, parse) {
for (var k in obj) {
if (typeof obj[k] === 'object' && obj[k] !== null) {
parseObjectProperties(obj[k], parse)
} else if (obj.hasOwnProperty(k)) {
parse(obj[k])
}
}
}
Я использую объект foo
OP, вот как это работает
var foo = {
bar:'a',
child:{
b: 'b',
grand:{
greatgrand: {
c:'c'
}
}
}
}
// use this recursive function with a parse funciton
function parseObjectProperties (obj, parse) {
for (var k in obj) {
if (typeof obj[k] === 'object' && obj[k] !== null) {
parseObjectProperties(obj[k], parse)
} else if (obj.hasOwnProperty(k)) {
parse(obj[k])
}
}
}
//***
// then apply to the property the task you want, in this case just console
parseObjectProperties(foo, function(prop) {
console.log(prop)
})