Javascript null被指定为尾部递归函数中的对象

Javascript null被指定为尾部递归函数中的对象,javascript,null,tail-recursion,typeof,Javascript,Null,Tail Recursion,Typeof,我有一个尾部递归函数,其目的是在任何数量的嵌套对象中查找任何number,并在其上运行toFixed() 函数formatData()的工作原理是循环遍历对象,测试当前迭代所使用的值的类型,在所述迭代上执行函数(toFixed())并将其保存在新对象中,或者不执行任何操作,只按原样保存值。最终结果将是一个相同的对象,但任何长的小数位数都将被修剪为两位小数 在测试过程中,我发现如果在任何级别的对象中有一个null值,它首先被保存为null,但后来成为对象。我知道在JS中,null被认为是类型obj

我有一个尾部递归函数,其目的是在任何数量的嵌套
对象中查找任何
number
,并在其上运行
toFixed()

函数formatData()的工作原理是循环遍历
对象
,测试当前迭代所使用的值的类型,在所述迭代上执行函数(toFixed())并将其保存在新对象中,或者不执行任何操作,只按原样保存值。最终结果将是一个相同的对象,但任何长的小数位数都将被修剪为两位小数

在测试过程中,我发现如果在任何级别的
对象
中有一个
null
值,它首先被保存为
null
,但后来成为
对象
。我知道在JS中,null被认为是类型
object
,而
typeof
关键字将显示这一点

下面是问题的代码笔: 请注意,第三个控制台条目显示了正确分配/保存为
null
的值。如后所述,它最终成为一个
对象

功能:

function formatData(data) {
    const formattedData = {}
    for (const key in data) {
        if (data[key] === null) formattedData[key] = null
        // if (data[key] === null) formattedData[key] = 'null' // have tried saving as diff val, didn't work
        if (data[key] === false) formattedData[key] = false
        if (typeof data[key] === 'number') formattedData[key] = data[key].toFixed(2)
        if (typeof data[key] === 'object') formattedData[key] = formatData(data[key]) // tail recursion
    }
    return formattedData
}
鉴于:

const data = {
     status: false,
     survey: {
         2018: 3.4288,
         2019: 3.47701,
         2020: null,
     },
     benchmarks: {
         company: 3.455,
         industry: 3.5,
         portfolio: 3.4,
     },
}
const formattedData = formatData(data)
期望值(格式化数据):

实际结果(格式化数据):


您需要从对象检查中排除
null

if (data[key] && typeof data[key] === 'object')
//  ^^^^^^^^^^^^
您可以更改仅检查不同处理的值的逻辑,如数字和对象和
continue
,或者只将给定值分配给新对象

函数格式数据(数据){
const formattedData={}
for(常量输入数据){
if(数据类型[键]=“编号”){
formattedData[key]=数据[key].toFixed(2)
继续;
}
if(数据[键]&&typeof数据[键]=“对象”){
formattedData[键]=FormattData(数据[键]);
继续;
}
格式化数据[键]=数据[键];
}
返回格式化数据;
}
常数
数据={
状态:false,
调查:{
2018: 3.4288,
2019: 3.47701,
2020年:零
},
基准:{
公司:3.455,
工业:3.5,,
投资组合:3.4
}
},
formattedData=FormattData(数据);

console.log(格式化数据)
在null上的相等是否无效?问题是,
null
是一个对象。所以它永远不会相等在
null
上不确定,可能是
未定义的
{
  "status": false,
  "survey": {
    "2018": "3.43",
    "2019": "3.48",
    "2020": {} // this should be `null`
  },
  "benchmarks": {
    "company": "3.50",
    "industry": "3.50",
    "portfolio": "3.40"
  }
}
if (data[key] && typeof data[key] === 'object')
//  ^^^^^^^^^^^^