index.js 1.4 KB

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