Alina Poluykova
Alina Poluykova

Reputation: 145

Get all namespaces within an object in Javascript?

I have a deeply nested object: { a: { b: { c: 3 }, d: 4 } }.

How to get all namespaces within this object?

So, I need to get: ['a.b.c', 'a.d'].

Upvotes: 0

Views: 316

Answers (4)

Nina Scholz
Nina Scholz

Reputation: 386746

You could check the keys and iterate otherwise push the path to the result set.

function getKeys(object) {
    function iter(o, p) {
        var keys = Object.keys(o);
        keys.length ?
            keys.forEach(function (k) { iter(o[k], p.concat(k)); }):
            result.push(p.join('.'));
    }
    var result = [];
    iter(object, []);
    return result;
}

var object = { a: { b: { c: 3 } }, d: 4 };

console.log(getKeys(object));
.as-console-wrapper { max-height: 100% !important; top: 0; }

Upvotes: 0

quirimmo
quirimmo

Reputation: 9988

You could create a script in order to flatten the object and return the keys. You could also think to convert it to an array and use the default flatten of arrays. Here an example of flattening the object.

var flattenObject = function(ob) {
    	var toReturn = {};
    	
    	for (var i in ob) {
    		if (!ob.hasOwnProperty(i)) continue;
    		
    		if ((typeof ob[i]) == 'object') {
    			var flatObject = flattenObject(ob[i]);
    			for (var x in flatObject) {
    				if (!flatObject.hasOwnProperty(x)) continue;
    				
    				toReturn[i + '.' + x] = flatObject[x];
    			}
    		} else {
    			toReturn[i] = ob[i];
    		}
    	}
    	return toReturn;
    };

    var obj = {a: {b: {c: 3} }, d: 4 }
    console.log(Object.keys(flattenObject(obj))); // ['a.b.c', 'd']

p.s. your object in the question has a mistake, or what you want is not what you are asking. d is at the same level of a, so you can't achieve "a.d", but "d"

Upvotes: 1

d9ngle
d9ngle

Reputation: 1469

var t = {a: {b: {c: 3} }, d: 4 };

path (t, '');

function path(t, sofar) {

  if (Object.keys(t).length === 0)
    console.log(sofar.substr(1));
  
  var keys = Object.keys(t);
  
  for (var i = 0 ; i < keys.length ; ++i) {
    path(t[keys[i]], sofar+'.'+keys[i]);
  }
  
}

Upvotes: 3

Nenad Vracar
Nenad Vracar

Reputation: 122087

You can create recursive function using for...in loop.

var obj = {a: {b: {c: 3} }, d: 4 }

function getKeys(data, prev) {
  var result = []
  for (var i in data) {
    var dot = prev.length ? '.' : '';
    if (typeof data[i] == 'object') result.push(...getKeys(data[i], prev + dot + i))
    else result.push(prev + dot + i)
  }
  return result;
}

console.log(getKeys(obj, ''))

Instead of for...in loop you can use Object.keys() and reduce().

var obj = {a: {b: {c: 3} }, d: 4 }

function getKeys(data, prev) {
  return Object.keys(data).reduce(function(r, e) {
    var dot = prev.length ? '.' : '';
    if (typeof data[e] == 'object') r.push(...getKeys(data[e], prev + dot + e))
    else r.push(prev + dot + e)
    return r;
  }, [])
}

console.log(getKeys(obj, ''))

Upvotes: 4

Related Questions