I’m iterating through a JS object (obj) and would like to retrieve the parent property of a property. E.g. if k is ‘v9’. Something like k.parent would return ‘c’ and k.parent.parent would return ‘b’. Of course, the syntax is different and that’s what I’m looking for
function iterate(o) { Object.keys(o).forEach(function (k) { if (o[k] !== null && typeof o[k] === 'object') { iterate(o[k]); return; } if (typeof o[k] === 'boolean') { // e.g. k is 'v9'. How to get its parent properties? // like k.parent would return 'c' and k.parent.parent would return 'b' } }); } const obj = { a: { 'v1': true, 'v2': true, 'v3': false }, b: { 'v4': false, 'v5': true, 'v6': false, c: { 'v7': false, 'v8': true, 'v9': false } } } iterate(obj);
Advertisement
Answer
an idea can be to store the parent key as a parameter of iterate function
function iterate(o, parentKey) { Object.keys(o).forEach(function (k) { if (o[k] !== null && typeof o[k] === 'object') { iterate(o[k], k); return; } if (typeof o[k] === 'boolean') { console.log(k); console.log(parentKey); } }); } const obj = { a: { 'v1': true, 'v2': true, 'v3': false }, b: { 'v4': false, 'v5': true, 'v6': false, c: { 'v7': false, 'v8': true, 'v9': false } } } iterate(obj);
Another idea can be to stored a structure fill at each iterate step if there is a parent to the current object use recursive behavior to fill it
function iterate(o, parent) { Object.keys(o).forEach(function (k) { if (o[k] !== null && typeof o[k] === 'object') { const nextParent = { name: k }; if (parent.name) { nextParent.parent = parent; } iterate(o[k], nextParent); return; } if (typeof o[k] === 'boolean') { console.log(k); console.log(parent); } }); } const obj = { a: { 'v1': true, 'v2': true, 'v3': false }, b: { 'v4': false, 'v5': true, 'v6': false, c: { 'v7': false, 'v8': true, 'v9': false } } } iterate(obj, {});