Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

182
Views
Get parent, grandparent and key in the deep nested object structure

I have a deeply nested structure in the javascript object without any arrays in it.

var data = {
  bar: 'a',
  child: {
    b: 'b',
    grand: {
      greatgrand: {
        c: 'c'
      }
    }
  }
};

let arr = [];

const findParentGrandparent = (obj, target) => {
  Object.entries(obj).forEach(child => {
    if (typeof child[1] === 'object') {
      findParentGrandparent(child[1]);
    }
  });
};
findParentGrandparent(data, 'c');

When I call the function with a target, I want to get the taget key itself, parent and grandparent. For example, if the target is 'c', arr should become

['c', 'greatgrand', 'grand', 'child'];

if target is 'greatgrand', it should become

['greatgrand', 'grand', 'child'];

Thanks

about 4 years ago · Juan Pablo Isaza
3 answers
Answer question

0

You can use a recursive generator function:

function* get_vals(d, target, c = []){
    for (var i of Object.keys(d)){
        if (i === target){
           yield [target, ...c.slice(0, 3)]
        }
        if (typeof d[i] === 'object'){
            yield* get_vals(d[i], target, c = [i, ...c])
        }
    }
} 
var result = get_vals(data, 'c').next().value

Output:

["c", "greatgrand", "grand", "child"]
about 4 years ago · Juan Pablo Isaza Report

0

var data = {
    bar: 'a',
    child: {
        b: 'b',
        grand: {
            greatgrand: {
                c: 'c'
            }
        }
    }
};

/**
* @param validate {boolean} = true - Pass true if need to check for existance of `target`
*/
const findParentGrandparent = (obj, target, validate = true) => {
    let result = [];
    for (let [key, value] of Object.entries(obj)) {
        if (key === target) {
            result.push(key);
            break;
        }
        if (value.toString() === '[object Object]') {
            result.push(key);
            result = result.concat(findParentGrandparent(value, target, false))
        }
    }

    if (validate && !result.includes(target)) {
        return 'Not found';
    }

    return result;
};

let resultC = findParentGrandparent(data, 'c').reverse();
let resultGreatgrand = findParentGrandparent(data, 'greatgrand').reverse();


console.log('Result for "c":', resultC);
console.log('Result for "greatgrand":', resultGreatgrand);

about 4 years ago · Juan Pablo Isaza Report

0

I did it using your recursive pattern, you can change the way it handle errors also, here I throw if there is no result.

var data = {
  bar: 'a',
  child: {
    b: 'b',
    grand: {
      greatgrand: {
        c: 'c'
      }
    }
  }
};

let arr = [];

const findParentGrandparent = (obj, target) => {
  for (const child of Object.entries(obj)) {
    if (typeof child[1] === 'object' && child[0] !== target) {
      const result = findParentGrandparent(child[1], target);
      return [...result, child[0]];
    } else if (child[0] === target) {
      return [child[0]];
    }
  };
  throw new Error("not found"); // If it goes there the object is not found, you can throw or return a specific flag, as you wish.
};

console.log(findParentGrandparent(data, 'c'));

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!