Fork me on GitHub
Show:

File: ../src/util/parseobjectvalues.js

define([
  'aeris/util'
], function(_) {
  /**
   * Parse end-leaf values of deep nested objects,
   * replacing string'ed objects to their
   * primitive values.
   *
   * Useful for processing inputs that are serialized
   * only as strings (eg. forms, querystring routes).
   *
   * eg. {
   *     num: '18.5',
   *     arr: [
   *       'true',
   *       {
   *         obj: {
   *           boolFalse: 'false',
   *           nums: ['16.5', 82, '19.001']
   *         }
   *       }
   *     ],
   *     obj: {
   *       str: 'str',
   *       boolTrue: 'true',
   *       boolTrueReal: true,
   *       nums: {
   *         numsA: [22, '15'],
   *         numsB: [18, {
   *           num: '-96.15'
   *         }]
   *       }
   *     }
   *   }
   * becomes:
   * {
   *     num: 18.5,
   *     arr: [
   *       true,
   *       {
   *         obj: {
   *           boolFalse: false,
   *           nums: [16.5, 82, 19.001]
   *         }
   *       }
   *     ],
   *     obj: {
   *       str: 'str',
   *       boolTrue: true,
   *       boolTrueReal: true,
   *       nums: {
   *         numsA: [22, 15],
   *         numsB: [18, {
   *           num: -96.15
   *         }]
   *       }
   *     }
   *   }
   *
   * @param {string} str
   * @return {*}
   * @method parseObjectValues
   */
  var parseObjectValues = function(str) {
    var arr, obj;

    if (_.isArray(str)) {
      arr = str.slice(0);
      // Parse all array values recursively
      return arr.map(parseObjectValues, this);
    }
    if (_.isObject(str)) {
      obj = _.clone(str);
      // Parse all object values recursively.
      _.each(str, function(val, key) {
        str[key] = parseObjectValues(val);
      }, this);
      return str;
    }

    if (str === 'NaN') {
      return NaN;
    }
    if (str === 'undefined') {
      return undefined;
    }
    if (str === 'null') {
      return null;
    }
    if (str === 'true') {
      return true;
    }
    if (str === 'false') {
      return false;
    }
    if (_.isNumeric(str)) {
      return parseFloat(str);
    }

    return str;
  };

  return parseObjectValues;
});