JSFiddle - React, Tailwind, and code Playground

HTML

<script src="https://jsfiddle.net/fxay76k8/1/"></script>
<script src="https://rawgit.com/kriskowal/q/v1/q.js"></script>
<ul id="log"></ul>

CSS

#log, #log li {
    margin: 0;
    padding: 0;
}

#log li {
    border-left: 6px solid #ddd;
    padding-left: 6px;
    margin-bottom: 1em;
}

JavaScript

var logEl = document.getElementById('log');
function log(){
    logEl.innerHTML += '<li><pre>' + Array.prototype.map.call(arguments, function(a){ return a === undefined ? 'undefined' : JSON.stringify(a, null, 2); })
    .join(', ') + '</pre></li>';
}

var target = {
  "a": "b",
  "c": [{
      "d": "e",
      "f": "g",
      "h": [{
          "i": "j",
          "k": "l",
          "m": "n"
        },
        {
          "i": "o",
          "k": "p",
          "m": "q"
        }
      ]
    },
    {
      "d": "e",
      "f": "g",
      "h": [{
          "i": "r",
          "k": "s",
          "m": "t"
        },
        {
          "i": "u",
          "k": "v",
          "m": "w"
        }
      ]
    },
  ],
};

var stack = ["c", "[]", "h", "0", "i"];

transformStack(target, stack).then(function(results){
	log(results);
});

/** Expected Output ****



var target = {
  "a": "b",
  "c": [{
      "d": "e",
      "f": "g",
      "h": [{
          "i": "~j",
          "k": "l",
          "m": "n"
        },
        {
          "i": "o",
          "k": "p",
          "m": "q"
        }
      ]
    },
    {
      "d": "e",
      "f": "g",
      "h": [{
          "i": "~r",
          "k": "s",
          "m": "t"
        },
        {
          "i": "u",
          "k": "v",
          "m": "w"
        }
      ]
    },
  ],
};





//**/


function transformStack(target, stack) {
  var deferred = Q.defer();
  var stackItem = stack.shift(); //Copy Value

  switch (stackItem) {
    case "[]":
      for (var x = 0; x < target.length; x++) {

        var nextTarget = JSON.parse(JSON.stringify(target[x])); //Copies values so not by Ref any more

        if (stack.length > 0) {
          target[x] = transformStack(nextTarget, JSON.parse(JSON.stringify(stack)));
        } else {
          target[x] = transformItem(nextTarget);
        }
      }
      break;
    default:
      var nextTarget = JSON.parse(JSON.stringify(target[stackItem])); //Copies values so not by Ref any more

...