JSFiddle - React, Tailwind, and code Playground

by Trevor W

JavaScript

const isObject = function (o) {
  return o === Object(o) && !isArray(o) && typeof o !== 'function';
};

const isArray = function (a) {
  return Array.isArray(a);
};

const snakeToCamel = (s) => {
  return s.replace(/([-_][a-z])/ig, ($1) => {
    return $1.toUpperCase()
      .replace('-', '')
      .replace('_', '');
  });
};

const camelToSnake = (s) => {  
  return s.split(/(?=[A-Z])/).join('_').toLowerCase();
};

const snakeCaseKeysToCamelCaseKeys = function (o) {
  if (isObject(o)) {
    const n = {};

    Object.keys(o)
      .forEach((k) => {
        n[snakeToCamel(k)] = snakeCaseKeysToCamelCaseKeys(o[k]);
      });

    return n;
  } else if (isArray(o)) {
    return o.map((i) => {
      return snakeCaseKeysToCamelCaseKeys(i);
    });
  }

  return o;
};

const camelCaseKeysToSnakeCaseKeys = function (o) {
  if (isObject(o)) {
    const n = {};

    Object.keys(o)
      .forEach((k) => {
        n[camelToSnake(k)] = camelCaseKeysToSnakeCaseKeys(o[k]);
      });

    return n;
  } else if (isArray(o)) {
    return o.map((i) => {
      return camelCaseKeysToSnakeCaseKeys(i);
    });
  }

  return o;
};



let foo = {
	"nameSpace": "foobar",
  "anotherName": {
  	"that_has_more": "stuff_inside",
    "maybe_thisIs": "good",
    "orMaybe": {
    	"weCanContinue": "this madness",
      "untilAllTime": true
    }
  }
}

console.log(foo);
console.log(snakeCaseKeysToCamelCaseKeys(foo));
console.log(camelCaseKeysToSnakeCaseKeys(foo));