diff --git a/papaparse.js b/papaparse.js index c3e3e56..d8e883b 100644 --- a/papaparse.js +++ b/papaparse.js @@ -193,7 +193,21 @@ function CsvToJson(_input, _config) { _config = _config || {}; - _config.dynamicTyping = new DynamicTypingConfig(_config.dynamicTyping); + var dynamicTyping = _config.dynamicTyping || false; + debugger; + if (typeof dynamicTyping == 'function') { + _config.dynamicTypingFunction = dynamicTyping; + // Will be filled on first row call + dynamicTyping = {}; + } + _config.dynamicTyping = dynamicTyping; + _config.shouldApplyDynamicTyping = function(field) { + // Cache function values to avoid calling it for each row + if (_config.dynamicTypingFunction && !_config.dynamicTyping[field]) { + _config.dynamicTyping[field] = _config.dynamicTypingFunction(field); + } + return (_config.dynamicTyping[field] || _config.dynamicTyping) === true + } if (_config.worker && Papa.WORKERS_SUPPORTED) { @@ -415,24 +429,6 @@ } } - function DynamicTypingConfig(config) - { - this._config = config; - } - DynamicTypingConfig.prototype.constructor = DynamicTypingConfig; - DynamicTypingConfig.prototype.isIncluded = function(field) - { - if (typeof this._config === 'function') - { - return this._config(field) === true; - } - if (typeof this._config === 'object') - { - return this._config[field] === true; - } - return !!this._config; - }; - /** ChunkStreamer is the base prototype for various streamer implementations. */ function ChunkStreamer(config) { @@ -987,7 +983,7 @@ function parseDynamic(field, value) { - if (_config.dynamicTyping.isIncluded(field)) + if (_config.shouldApplyDynamicTyping(field)) { if (value === 'true' || value === 'TRUE') return true;