index.js 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. 'use strict';
  2. module.exports = function (obj) {
  3. if (typeof obj === 'string') { return camelCase(obj); }
  4. return walk(obj);
  5. };
  6. function walk(obj) {
  7. if (!obj || typeof obj !== 'object') { return obj; }
  8. if (isDate(obj) || isRegex(obj)) { return obj; }
  9. if (isArray(obj)) { return map(obj, walk); }
  10. return reduce(objectKeys(obj), function (acc, key) {
  11. var camel = camelCase(key);
  12. acc[camel] = walk(obj[key]);
  13. return acc;
  14. }, {});
  15. }
  16. function camelCase(str) {
  17. return str.replace(/[_.-](\w|$)/g, function (_, x) {
  18. return x.toUpperCase();
  19. });
  20. }
  21. var isArray = Array.isArray || function (obj) {
  22. return Object.prototype.toString.call(obj) === '[object Array]';
  23. };
  24. var isDate = function (obj) {
  25. return Object.prototype.toString.call(obj) === '[object Date]';
  26. };
  27. var isRegex = function (obj) {
  28. return Object.prototype.toString.call(obj) === '[object RegExp]';
  29. };
  30. var has = Object.prototype.hasOwnProperty;
  31. var objectKeys = Object.keys || function (obj) {
  32. var keys = [];
  33. for (var key in obj) {
  34. if (has.call(obj, key)) { keys.push(key); }
  35. }
  36. return keys;
  37. };
  38. function map(xs, f) {
  39. if (xs.map) { return xs.map(f); }
  40. var res = [];
  41. for (var i = 0; i < xs.length; i++) {
  42. res.push(f(xs[i], i));
  43. }
  44. return res;
  45. }
  46. function reduce(xs, f, acc) {
  47. if (xs.reduce) { return xs.reduce(f, acc); }
  48. for (var i = 0; i < xs.length; i++) {
  49. acc = f(acc, xs[i], i);
  50. }
  51. return acc;
  52. }