【问题标题】:How to convert the data type in JSON nodejs如何转换JSON nodejs中的数据类型
【发布时间】:2019-08-23 20:05:14
【问题描述】:

我有一个 NodeJS Express 代码,它只是以请求-响应格式将数据从客户端传递到我的后端服务器。 现在我的客户期望 JSON 响应中的美元金额为双精度数据类型。 我如何动态地做到这一点。 例如下面,

var data =   [
{
   "feeType":"Trip",
   "feeCategory":"Transaction",
   "feeAmount":0,
   "isApplicable":true,
   "isRequired":true,
   "applicableDeliveryType":"None",
   "appliedFeeAmount":0
},
{
   "feeType":"FerryFee",
   "feeCategory":"Passenger",
   "feeAmount":2,
   "isApplicable":true,
   "isRequired":false,
   "applicableDeliveryType":"None",
   "appliedFeeAmount":2
},
{
   "feeType":"WillCall",
   "feeCategory":"Service",
   "feeAmount":0,
   "isApplicable":false,
   "isRequired":false,
   "applicableDeliveryType":"Pickup",
   "appliedFeeAmount":0
},
{
   "feeType":"NotTravelling",
   "feeCategory":"Service",
   "feeAmount":0,
   "isApplicable":false,
   "isRequired":false,
   "applicableDeliveryType":"PrintAtHome",
   "appliedFeeAmount":0
},
{
   "feeType":"Pickup",
   "feeCategory":"Delivery",
   "feeAmount":0,
   "isApplicable":false,
   "isRequired":false,
   "applicableDeliveryType":"None",
   "appliedFeeAmount":0
},
{
   "feeType":"PrintAtHome",
   "feeCategory":"Delivery",
   "feeAmount":0,
   "isApplicable":false,
   "isRequired":false,
   "applicableDeliveryType":"None",
   "appliedFeeAmount":0
}

]

我的客户期望使用 .0 或十进制数字的数值。我该怎么做?

【问题讨论】:

  • 泷的回答是正确的;只是想指出您的输出不是 JSON 而是一个对象,并且您不是要更改数据类型,而是要更改格式。 JavaScript 中没有“双”数据类型。
  • JSON没有double数据类型,只有数字类型,36.036等价。
  • 您的最终目标是什么?没有理由将整数序列化为小数,这只会在您发送或接收数据时不必要地增加传输大小。如果您打算以某种方式显示数据,您只需在将数字插入视图时调用toFixed()

标签: javascript arrays node.js json


【解决方案1】:

使用Object.entries 循环遍历对象并使用.toFixed() 添加小数:

const data = [{
    "feeType": "Trip",
    "feeCategory": "Transaction",
    "feeAmount": 0,
    "isApplicable": true,
    "isRequired": true,
    "applicableDeliveryType": "None",
    "appliedFeeAmount": 0
  },
  {
    "feeType": "FerryFee",
    "feeCategory": "Passenger",
    "feeAmount": 2,
    "isApplicable": true,
    "isRequired": false,
    "applicableDeliveryType": "None",
    "appliedFeeAmount": 2
  }
]

const result = data.map(o => Object.entries(o).reduce((acc, [key, value]) => {
  acc[key] = typeof value.toFixed === 'function' ? value.toFixed(1) : value;
  return acc;
}, {}))
console.log(result);

for .. in

const data = [{
    "feeType": "Trip",
    "feeCategory": "Transaction",
    "feeAmount": 0,
    "isApplicable": true,
    "isRequired": true,
    "applicableDeliveryType": "None",
    "appliedFeeAmount": 0
  },
  {
    "feeType": "FerryFee",
    "feeCategory": "Passenger",
    "feeAmount": 2,
    "isApplicable": true,
    "isRequired": false,
    "applicableDeliveryType": "None",
    "appliedFeeAmount": 2
  }
]
const result = [];
data.forEach(o => {
  const tempObj = {};
  for (let key in o) {
    tempObj[key] = typeof o[key].toFixed === 'function' ? o[key].toFixed(1) : o[key];
  }
  result.push(tempObj);
});
console.log(result);

【讨论】:

  • 如果 OP 不介意现在将值作为字符串而不是数字,那么您的解决方案很好。
  • @Dez 在 JS 中,你不能有一个以 .0 结尾的数字。任何小数点后为零的数字将始终表示为整数。所以它必须是一个字符串。
  • @taki 如果我在 JSON 对象中间有一个字符串值怎么办? .toFixed 是否将所有内容都转换为小数?
  • 不,如果你有数字作为字符串,你应该先解析它们,parseFloat(value).toFixed(2),第二个例子parseFloat(data[key]).toFixed(2)
  • "feeType":"FerryFee", "feeCategory":"Passenger", "feeAmount":2, "isApplicable":true, "isRequired":false, "applicableDeliveryType":"None", "appliedFeeAmount":2 }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-17
  • 2019-03-16
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
相关资源
最近更新 更多