如何解决在尾部递归函数中将null分配为对象
我有一个尾部递归函数,其目的是在任意数量的嵌套number
中找到任何objects
,然后在其上运行toFixed()
。
函数formatData()的工作方式是循环遍历object
,测试以查看当前迭代处于哪种类型的值,在该迭代上执行一个函数(toFixed())并将其保存在新值中反对或不执行任何操作,仅按原样保存值。最终结果将是一个相同的对象,但任何长的小数点后位数都被修剪为两个小数位。
在测试过程中,我发现如果null
中的任何级别都有一个object
值,则首先将其保存为null
,但后来将其保存为{{1 }}。我知道在JS中,object
的类型为null
,而object
关键字将显示此类型。
这是问题的代码笔:https://codepen.io/Danny_Wobble/pen/YzqMzxw
请注意,第三个控制台条目显示正确分配/保存为typeof
的值。稍后如描述的那样,最终以null
结束。
功能:
object
给出:
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
}
期望(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)
实际结果(formattedData):
{
"status": false,"survey": {
"2018": "3.43","2019": "3.48","2020": null,"benchmarks": {
"company": "3.50","industry": "3.50","portfolio": "3.40",}
解决方法
您需要从对象检查中排除null
个值。
if (data[key] && typeof data[key] === 'object')
// ^^^^^^^^^^^^
您可以更改仅检查用于不同处理的值(例如数字和对象以及continue
)的逻辑,也可以仅将给定值分配给新对象。
function formatData(data) {
const formattedData = {}
for (const key in data) {
if (typeof data[key] === 'number') {
formattedData[key] = data[key].toFixed(2)
continue;
}
if (data[key] && typeof data[key] === 'object') {
formattedData[key] = formatData(data[key]);
continue;
}
formattedData[key] = data[key];
}
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
}
},formattedData = formatData(data);
console.log(formattedData);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。