JSFiddle - React, Tailwind, and code Playground

by Daniel Lizik

HTML

<pre id="pre"></pre>

JavaScript

var ref = {
  z: {},
  e: [],
  a: 'dog',
  b: 'cat',
  c: {
    a: 'elephant',
    b: {
      a: 'monkey',
      b: ['cat', 'dog', { a: 'lizard', b: 'squirrel' }]
    }
  },
  d: [
    4, 
    56, 
    null, 
    [
      1, 
      34, 
      { a: 'cat' } 
    ]
  ]
};

var lib = (function(global, factory) {
	'use strict';  
   return factory();
})(this, function() {
	'use strict';
  
  function lib(ref) {
    var bucket = treewalk(ref, {}, '', '.');
		return bucket;
  }
  
  function treewalk(obj, bucket, pathStr, delim) {
  
    var i, p, last = pathStr.slice(0, pathStr.length - 1);
		  	
  	if (Array.isArray(obj)) {
      if (obj.length === 0)
        bucket[last] = obj;
      else {
				for (i = 0; i < obj.length; i++)
				  treewalk(obj[i], bucket, pathStr + i + delim, delim)
			}
    }
      
    else if (Object.prototype.toString.call(obj) === '[object Object]') {
      if (Object.keys(obj).length === 0)
				bucket[last] = obj;								
		  else {
				for (p in obj)
					treewalk(obj[p], bucket, pathStr + p + delim, delim);
			}
    }
      
    else if (typeof obj === 'number' || typeof obj === 'string' || obj === null) 
    	bucket[last] = obj;
     
    else if (obj === undefined)
      throw new Error('cannot pass undefined');
      
    return bucket;
  }
  
  return lib;

});

document.querySelector('#pre').textContent = JSON.stringify(lib(ref), null, 2)