0

I have a JSONArray in this format:

[
{"COMPLIANCE_ID":"1/FIRST/US/191CC2/20160906/pW1WSpD/1","TOLERANCE":null,"WEIGHTED_ARR_LAST_SLP":"0.03801186624130076","SLIPPAGE_INTERVAL_VWAP_BPS":"10.2711","ROOT_ORDER_ID":"735422197553491","ENTERING_TRADER":"duffy_dma2","SECURITY_ID":"EOG.N","ARRIVAL_MID_PX":"93.6100","WEIGHTED_ARR_SLP":"0.12323190317127024","AVG_PX":"93.6586","ORDER_CCY":"USD","LEAVES_QTY":"0","WEIGHT":"0.02372627566400397","INITIATING_TRADER":null,"PARTICIPATION_RATE":"0E-12","LOCAL_REF_END_TIME":"2016-09-06 06:00:27.775","WEIGHTED_IVWAP_SLP":"0.2436949499725512","NOTIONAL_USD":"477940","LIST_ID":null,"SYM":"EOG","LIQ_CONSUMPTION":"15.21","URGENCY":null,"SIDE":"Sell Short","ALGO":"Hydra","EXECUTING_TRADER":"duffy_dma2","EXEC_QTY":"5103","CL_ORD_ID":"7245294057012908344","LOCAL_REF_START_TIME":"2016-09-06 05:59:57.844","SLIPPAGE_END_LAST_ARR_LAST_BPS":"1.6021","ORD_STATUS":"Filled","IVWAP_PX":"93.5625","LIMIT_PX":"93.6100","ORDER_ID":"735422197553491","VOLUME_LIMIT":"0E-12","SLIPPAGE_ARR_MID_BPS":"5.1939","ORDER_QTY":"5103","CLIENT_ACRONYM":"PEAKM","EXECUTION_STYLE":"2"},{"COMPLIANCE_ID":"1/FIRST/US/191CC2/20160906/pW1PUxP/1","TOLERANCE":null,"WEIGHTED_ARR_LAST_SLP":"-0.046488357264395964","SLIPPAGE_INTERVAL_VWAP_BPS":"0.1625","ROOT_ORDER_ID":"73855219760798","ENTERING_TRADER":"duffy_dma2","SECURITY_ID":"MCD.N","ARRIVAL_MID_PX":"118.0950","WEIGHTED_ARR_SLP":"-0.0041198933937856425","AVG_PX":"118.0923","ORDER_CCY":"USD","LEAVES_QTY":"0","WEIGHT":"0.01830250285999841","INITIATING_TRADER":null,"PARTICIPATION_RATE":"0E-12","LOCAL_REF_END_TIME":"2016-09-06 05:32:24.895","WEIGHTED_IVWAP_SLP":"0.002974156714749742","NOTIONAL_USD":"368684","LIST_ID":null,"SYM":"MCD","LIQ_CONSUMPTION":"62.82","URGENCY":null,"SIDE":"Sell","ALGO":"Hydra","EXECUTING_TRADER":"duffy_dma2","EXEC_QTY":"3122","CL_ORD_ID":"7244573979975932119","LOCAL_REF_START_TIME":"2016-09-06 05:32:19.697","SLIPPAGE_END_LAST_ARR_LAST_BPS":"-2.5400","ORD_STATUS":"Filled","IVWAP_PX":"118.0904","LIMIT_PX":"117.9900","ORDER_ID":"73855219760798","VOLUME_LIMIT":"0E-12","SLIPPAGE_ARR_MID_BPS":"-0.2251","ORDER_QTY":"3122","CLIENT_ACRONYM":"PEAKM","EXECUTION_STYLE":"4"}]

Here all the integers like "93.6585" etc. appear as strings. Is it possible to convert the integers/floats to their originate type (i.e., integer/float)? Background information: I'm using this JSONArray in Javascript and then want to do sorting on each column, but because those appear as strings, sorting is not happening properly.

This is how I need the json columns in javascript. So, where do I add parseInt or Number for the field ORDER QTY(say)?

Shek
  • 1
  • 2
  • 8
  • Do you know in advance which values need to be converted? For example, do you know that only the values for *LIQ_CONSUMPTION* and *WEIGHT* would need to be converted to numerics. The alternative is that you will try to convert everything that looks numeric, which may include *CL_ORD_ID* and even *ORD_STATUS* (assuming that happens to contain only a number)? – VLAZ Sep 08 '16 at 19:45
  • @Vld Yes everything that appears numeric should be converted to number. – Shek Sep 08 '16 at 19:50
  • Are you sure? Even IDs? Because those normally shouldn't be. – VLAZ Sep 08 '16 at 19:52
  • Yes, I need to. Everything that appears numeric in the JSONArray above need to be converted to Number. How do I do that in my above JS? – Shek Sep 08 '16 at 20:06
  • Please pretty-print your first array. You could loop over the values in each array element, if the value is defined and not an empty string `isNaN()` should tell you whether you're not dealing with a number and `- -` produces numbers: `if (typeof value !== 'undefined' && value != '' && ! isNaN(value)){ value=- -value };`. See also: [`isNaN` examples](http://www.w3schools.com/jsref/jsref_isnan.asp). – valid Sep 08 '16 at 20:45

3 Answers3

1

You can convert strings to integers and floats by doing:

parseFloat("1231.123");
parseInt("12");
Number("123");
Number("123.12");

Sources:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseFloat https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseInt

Schwarz
  • 395
  • 4
  • 18
  • Or use `Number("123")` which gives you a better and easier conversion. – VLAZ Sep 08 '16 at 18:56
  • @Vld Didn't know about that. Added it to my original post. – Schwarz Sep 08 '16 at 19:02
  • Or just simply +"123" – naortor Sep 08 '16 at 19:03
  • Don't forget to add the radix everytime you are using `parseFloat` or `parseInt` . e.g `parseInt('123', 10)`. – Vincent Taing Sep 08 '16 at 19:05
  • 2
    @VincentTaing `parseFloat` does not take a radix. And `parseInt` does and may do weird assumptions if not supplied. Both also do _parsing_ rather than conversion. It's weird but a valid thing to consider - `parseInt("1abc7")` will give you `1` out because as soon as it finds `a` it stops the parsing, bails out and give you whatever it extracted so far. Hence why I find `Number` better in a lot of cases, it does conversions which means if you give it the same string, which is an invalid number, you will get `NaN`. – VLAZ Sep 08 '16 at 19:16
  • I updated my question to show how I need the json in javascript. Where/ how do I add parseInt or Number in the Javascript? – Shek Sep 08 '16 at 19:18
  • @Vld Thanks for the correction, indeed parseFloat doesn't take radix. I did not know the difference between `Number` and `parseFloat`/`parseInt` – Vincent Taing Sep 08 '16 at 19:22
  • @VincentTaing Can you look at my updated question above? – Shek Sep 08 '16 at 19:26
1

In order to convert all numeric values this will suffuce:

var data = [{"COMPLIANCE_ID":"1/FIRST/US/191CC2/20160906/pW1WSpD/1","TOLERANCE":null,"WEIGHTED_ARR_LAST_SLP":"0.03801186624130076","SLIPPAGE_INTERVAL_VWAP_BPS":"10.2711","ROOT_ORDER_ID":"735422197553491","ENTERING_TRADER":"duffy_dma2","SECURITY_ID":"EOG.N","ARRIVAL_MID_PX":"93.6100","WEIGHTED_ARR_SLP":"0.12323190317127024","AVG_PX":"93.6586","ORDER_CCY":"USD","LEAVES_QTY":"0","WEIGHT":"0.02372627566400397","INITIATING_TRADER":null,"PARTICIPATION_RATE":"0E-12","LOCAL_REF_END_TIME":"2016-09-06 06:00:27.775","WEIGHTED_IVWAP_SLP":"0.2436949499725512","NOTIONAL_USD":"477940","LIST_ID":null,"SYM":"EOG","LIQ_CONSUMPTION":"15.21","URGENCY":null,"SIDE":"Sell Short","ALGO":"Hydra","EXECUTING_TRADER":"duffy_dma2","EXEC_QTY":"5103","CL_ORD_ID":"7245294057012908344","LOCAL_REF_START_TIME":"2016-09-06 05:59:57.844","SLIPPAGE_END_LAST_ARR_LAST_BPS":"1.6021","ORD_STATUS":"Filled","IVWAP_PX":"93.5625","LIMIT_PX":"93.6100","ORDER_ID":"735422197553491","VOLUME_LIMIT":"0E-12","SLIPPAGE_ARR_MID_BPS":"5.1939","ORDER_QTY":"5103","CLIENT_ACRONYM":"PEAKM","EXECUTION_STYLE":"2"},{"COMPLIANCE_ID":"1/FIRST/US/191CC2/20160906/pW1PUxP/1","TOLERANCE":null,"WEIGHTED_ARR_LAST_SLP":"-0.046488357264395964","SLIPPAGE_INTERVAL_VWAP_BPS":"0.1625","ROOT_ORDER_ID":"73855219760798","ENTERING_TRADER":"duffy_dma2","SECURITY_ID":"MCD.N","ARRIVAL_MID_PX":"118.0950","WEIGHTED_ARR_SLP":"-0.0041198933937856425","AVG_PX":"118.0923","ORDER_CCY":"USD","LEAVES_QTY":"0","WEIGHT":"0.01830250285999841","INITIATING_TRADER":null,"PARTICIPATION_RATE":"0E-12","LOCAL_REF_END_TIME":"2016-09-06 05:32:24.895","WEIGHTED_IVWAP_SLP":"0.002974156714749742","NOTIONAL_USD":"368684","LIST_ID":null,"SYM":"MCD","LIQ_CONSUMPTION":"62.82","URGENCY":null,"SIDE":"Sell","ALGO":"Hydra","EXECUTING_TRADER":"duffy_dma2","EXEC_QTY":"3122","CL_ORD_ID":"7244573979975932119","LOCAL_REF_START_TIME":"2016-09-06 05:32:19.697","SLIPPAGE_END_LAST_ARR_LAST_BPS":"-2.5400","ORD_STATUS":"Filled","IVWAP_PX":"118.0904","LIMIT_PX":"117.9900","ORDER_ID":"73855219760798","VOLUME_LIMIT":"0E-12","SLIPPAGE_ARR_MID_BPS":"-0.2251","ORDER_QTY":"3122","CLIENT_ACRONYM":"PEAKM","EXECUTION_STYLE":"4"}]

function isNumeric(n) { 
 return !isNaN(parseFloat(n)) && isFinite(n);
}

var parsedData = data.map(function(obj) {
 return Object.keys(obj).reduce(function(memo, key) {
  var value = obj[key];
  memo[key] = isNumeric(value) ? Number(value) : value;
  
  return memo;
 }, {})
})

console.log(parsedData);

isNumeric() - The implementation is taken from here because it is a robust way of figuring out if data is numeric or not including detecting negative numbers and floating points, among others.

Alternative one can be used but beware getting false positives or negatives.

Array.map() will iterate through the array and convert each object

Object.keys() extracts all the keys from the object

Array.reduce() finally transforms that array into a new object converting any value it encounters that looks numeric. Note the {} passed at the very end of the call - reduce(func, {}) - that is important, as it's the initial value used for the reduction function.

Community
  • 1
  • 1
VLAZ
  • 26,331
  • 9
  • 49
  • 67
0

Try and run it I am not sure that this is what you want but every value now is changed, and also make some tests my be I had made some mistakes.

var data =[{"COMPLIANCE_ID":"1/FIRST/US/191CC2/20160906/pW1WSpD/1","TOLERANCE":null,"WEIGHTED_ARR_LAST_SLP":"0.03801186624130076","SLIPPAGE_INTERVAL_VWAP_BPS":"10.2711","ROOT_ORDER_ID":"735422197553491","ENTERING_TRADER":"duffy_dma2","SECURITY_ID":"EOG.N","ARRIVAL_MID_PX":"93.6100","WEIGHTED_ARR_SLP":"0.12323190317127024","AVG_PX":"93.6586","ORDER_CCY":"USD","LEAVES_QTY":"0","WEIGHT":"0.02372627566400397","INITIATING_TRADER":null,"PARTICIPATION_RATE":"0E-12","LOCAL_REF_END_TIME":"2016-09-06 06:00:27.775","WEIGHTED_IVWAP_SLP":"0.2436949499725512","NOTIONAL_USD":"477940","LIST_ID":null,"SYM":"EOG","LIQ_CONSUMPTION":"15.21","URGENCY":null,"SIDE":"Sell Short","ALGO":"Hydra","EXECUTING_TRADER":"duffy_dma2","EXEC_QTY":"5103","CL_ORD_ID":"7245294057012908344","LOCAL_REF_START_TIME":"2016-09-06 05:59:57.844","SLIPPAGE_END_LAST_ARR_LAST_BPS":"1.6021","ORD_STATUS":"Filled","IVWAP_PX":"93.5625","LIMIT_PX":"93.6100","ORDER_ID":"735422197553491","VOLUME_LIMIT":"0E-12","SLIPPAGE_ARR_MID_BPS":"5.1939","ORDER_QTY":"5103","CLIENT_ACRONYM":"PEAKM","EXECUTION_STYLE":"2"},{"COMPLIANCE_ID":"1/FIRST/US/191CC2/20160906/pW1PUxP/1","TOLERANCE":null,"WEIGHTED_ARR_LAST_SLP":"-0.046488357264395964","SLIPPAGE_INTERVAL_VWAP_BPS":"0.1625","ROOT_ORDER_ID":"73855219760798","ENTERING_TRADER":"duffy_dma2","SECURITY_ID":"MCD.N","ARRIVAL_MID_PX":"118.0950","WEIGHTED_ARR_SLP":"-0.0041198933937856425","AVG_PX":"118.0923","ORDER_CCY":"USD","LEAVES_QTY":"0","WEIGHT":"0.01830250285999841","INITIATING_TRADER":null,"PARTICIPATION_RATE":"0E-12","LOCAL_REF_END_TIME":"2016-09-06 05:32:24.895","WEIGHTED_IVWAP_SLP":"0.002974156714749742","NOTIONAL_USD":"368684","LIST_ID":null,"SYM":"MCD","LIQ_CONSUMPTION":"62.82","URGENCY":null,"SIDE":"Sell","ALGO":"Hydra","EXECUTING_TRADER":"duffy_dma2","EXEC_QTY":"3122","CL_ORD_ID":"7244573979975932119","LOCAL_REF_START_TIME":"2016-09-06 05:32:19.697","SLIPPAGE_END_LAST_ARR_LAST_BPS":"-2.5400","ORD_STATUS":"Filled","IVWAP_PX":"118.0904","LIMIT_PX":"117.9900","ORDER_ID":"73855219760798","VOLUME_LIMIT":"0E-12","SLIPPAGE_ARR_MID_BPS":"-0.2251","ORDER_QTY":"3122","CLIENT_ACRONYM":"PEAKM","EXECUTION_STYLE":"4"}];

function isInt(n){
  if (n === null) return;
  n = Number(n);
  return !isNaN(n) && n % 1 === 0;
}

function isFloat(n) {
  if (n === null) return;
  n = Number(n);
  return !isNaN(n) && n % 1 !== 0;
}

var result = data.map(function(currVal) {
  for (var i = 0, keys = Object.keys(currVal), len = keys.length; i < len; i++) {
    var key = keys[i];
    var item = currVal[key];
    isInt(item) && (currVal[key] = parseInt(item));
    isFloat(item) && (currVal[key] = parseFloat(item));  
}
  return currVal;
});

console.log(result);
LkPark
  • 566
  • 4
  • 12
  • Why even have the `isInt` and `isParse` functions to decide whether to use `parseInt` or `parseFloat`? _By definition_ you have already gotten the numeric value out by the time you call `parseX`. Which means that if you get to call `parseFloat(item)` it's the third time you get the number out of the string. And the funny thing is - it doesn't matter whether you use `parseInt` or `parseFloat` because JavaScript doesn't differentiate between integers and floats. Just save yourself the trouble and code and replace all that with `Number(item)`. – VLAZ Sep 08 '16 at 19:32
  • @Vld I still cannot understand how to use Number(item) based on the javascript code I have provide. – Shek Sep 08 '16 at 19:37