JSFiddle - React, Tailwind, and code Playground

JavaScript

var input = {
  "details": {
    "device/0/endPointClientName": "ndm-xx-1",
    "device/1/endPointClientName": "ndm-xx-2",
    "EnergyMeter/0/current": "20",
    "EnergyMeter/0/total": "400",
  }
};

function decodeFlatObj(flatOjb) {
  var outputObj = {};
  for (var key in flatOjb) {
    var objNow = outputObj;
    var subkey = key.split('/');

    for (var i = 0; i < subkey.length - 1; i++) {
      // next subkey is number
      if (/\d|[1-9]\d*/.test(subkey[i + 1])) {
        // current subkey is number
        if (/\d|[1-9]\d*/.test(subkey[i])) {
          objNow.push([]);
          objNow = objNow[parseInt(subkey[i])];
        } else {
          objNow[subkey[i]] = objNow[subkey[i]] || [];
          objNow = objNow[subkey[i]];
        }
      } else { // next subkey is object
        // current subkey is number
        if (/\d|[1-9]\d*/.test(subkey[i])) {
          objNow[parseInt(subkey[i])] = objNow[parseInt(subkey[i])] || {};
          objNow = objNow[parseInt(subkey[i])];
        } else {
          objNow[subkey[i]] = objNow[subkey[i]] || {};
          objNow = objNow[subkey[i]];
        }
      }
    }

    var valueDecode;
    if (typeof flatOjb[key] === 'object') {
      valueDecode = decodeFlatObj(flatOjb[key]);
    } else {
      valueDecode = flatOjb[key];
    }

    if (/\d|[1-9]\d*/.test(subkey[subkey.length - 1])) {
      objNow[parseInt(subkey[subkey.length - 1])].push(valueDecode);
    } else {
      objNow[subkey[subkey.length - 1]] = valueDecode;
    }
  }

  return outputObj;
}

var output = decodeFlatObj(input);
console.log(input);
console.log(JSON.stringify(output));
//{"details":{"device":[{"endPointClientName":"ndm-xx-1"},{"endPointClientName":"ndm-xx-2"}],"EnergyMeter":[{"current":"20","total":"400"}]}}