【问题标题】:How to parse a JSONArray and convert in Javascript如何解析 JSONArray 并在 Javascript 中转换
【发布时间】:2016-09-08 18:42:19
【问题描述】:

我有一个这种格式的 JSONArray:

[
{"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"}]

这里所有的整数如"93.6585" 等都显示为字符串。是否可以将整数/浮点数转换为它们的原始类型(即整数/浮点数)? 背景信息:我在 Javascript 中使用这个 JSONArray,然后想对每一列进行排序,但是因为这些显示为字符串,所以排序不正确。

这就是我需要 javascript 中的 json 列的方式。那么,我应该在哪里为 ORDER QTY(say) 字段添加 parseInt 或 Number?

【问题讨论】:

  • 提前知道哪些值需要转换?例如,您是否知道只有 LIQ_CONSUMPTIONWEIGHT 的值需要转换为数字。另一种方法是您将尝试转换所有看起来是数字的东西,其中可能包括 CL_ORD_ID 甚至 ORD_STATUS(假设恰好只包含一个数字)?
  • @Vld 是的,所有出现数字的东西都应该转换为数字。
  • 你确定吗?甚至身份证?因为那些通常不应该。
  • 是的,我需要。上面 JSONArray 中出现的所有数字都需要转换为数字。我如何在上面的 JS 中做到这一点?
  • 请漂亮地打印您的第一个数组。您可以循环遍历每个数组元素中的值,如果值已定义并且不是空字符串 isNaN() 应该告诉您您是否没有处理数字并且 - - 生成数字:if (typeof value !== 'undefined' && value != '' && ! isNaN(value)){ value=- -value };。另见:isNaN examples.

标签: javascript arrays json parsing


【解决方案1】:

为了转换所有数值,这就足够了:

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() - 该实现取自here,因为它是一种确定数据是否为数字的可靠方法,包括检测负数和浮点等。

可以使用替代方法,但要注意误报或误报。

Array.map() 将遍历数组并转换每个对象

Object.keys() 从对象中提取所有键

Array.reduce() 最终将该数组转换为一个新对象,转换它遇到的任何看起来是数字的值。请注意在调用结束时传递的{} - reduce(func, {}) - 这很重要,因为它是用于归约函数的初始值。

【讨论】:

    【解决方案2】:

    【讨论】:

    • 或使用Number("123"),它可以让您进行更好、更轻松的转换。
    • @Vld 对此一无所知。将其添加到我的原始帖子中。
    • 或者只是简单地 +"123"
    • 不要忘记在每次使用 parseFloatparseInt 时添加基数。例如parseInt('123', 10).
    • @VincentTaing parseFloat 不采用基数。如果没有提供,parseInt 会并且可能会做出奇怪的假设。两者都进行解析而不是转换。这很奇怪,但值得考虑 - parseInt("1abc7") 会给你1,因为一旦它找到a,它就会停止解析,退出并给你到目前为止它提取的任何东西。因此,为什么我在很多情况下发现Number 更好,它会进行转换,这意味着如果你给它相同的字符串,这是一个无效的数字,你会得到NaN
    【解决方案3】:

    尝试运行它

    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);

    【讨论】:

    • 为什么还要有isIntisParse 函数来决定是使用parseInt 还是parseFloat根据定义,当您调用parseX 时,您已经获得了数值。这意味着如果您拨打parseFloat(item),这是您第三次从字符串中获取号码。有趣的是——使用parseIntparseFloat 都没有关系,因为JavaScript 不区分整数和浮点数。省去你自己的麻烦和代码,用Number(item)替换所有的代码。
    • @Vld 根据我提供的 javascript 代码,我仍然无法理解如何使用 Number(item)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-12
    • 2023-01-03
    • 1970-01-01
    • 1970-01-01
    • 2014-12-21
    • 2021-07-25
    • 2023-03-17
    相关资源
    最近更新 更多