null被分配为尾递归函数中的对象
null being assigned as object in tail recursive function
我有一个尾递归函数,其目的是在任意数量的嵌套 objects
中找到任何 number
并简单地 运行 其上的 toFixed()
。
函数 formatData() 的工作原理是循环遍历 object
,测试当前迭代的值类型,对所述迭代执行函数(toFixed())并将其保存在一个新对象或什么也不做,只是按原样保存值。最终结果将是一个相同的对象,但任何长小数位数字都被修剪到两位小数。
在测试过程中,我发现如果 object
中的任何级别有一个 null
值,它首先会保存为 null
,但后来会变成 object
。我知道在 JS 中 null
被认为是类型 object
并且 typeof
关键字将显示这一点。
这是问题的代码笔:https://codepen.io/Danny_Wobble/pen/YzqMzxw
请注意,第三个控制台条目显示的值正确 assigned/saved 为 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
}
给定:
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)
预期(格式化数据):
{
"status": false,
"survey": {
"2018": "3.43",
"2019": "3.48",
"2020": null,
},
"benchmarks": {
"company": "3.50",
"industry": "3.50",
"portfolio": "3.40",
},
}
实际结果(格式化数据):
{
"status": false,
"survey": {
"2018": "3.43",
"2019": "3.48",
"2020": {} // this should be `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);
我有一个尾递归函数,其目的是在任意数量的嵌套 objects
中找到任何 number
并简单地 运行 其上的 toFixed()
。
函数 formatData() 的工作原理是循环遍历 object
,测试当前迭代的值类型,对所述迭代执行函数(toFixed())并将其保存在一个新对象或什么也不做,只是按原样保存值。最终结果将是一个相同的对象,但任何长小数位数字都被修剪到两位小数。
在测试过程中,我发现如果 object
中的任何级别有一个 null
值,它首先会保存为 null
,但后来会变成 object
。我知道在 JS 中 null
被认为是类型 object
并且 typeof
关键字将显示这一点。
这是问题的代码笔:https://codepen.io/Danny_Wobble/pen/YzqMzxw
请注意,第三个控制台条目显示的值正确 assigned/saved 为 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
}
给定:
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)
预期(格式化数据):
{
"status": false,
"survey": {
"2018": "3.43",
"2019": "3.48",
"2020": null,
},
"benchmarks": {
"company": "3.50",
"industry": "3.50",
"portfolio": "3.40",
},
}
实际结果(格式化数据):
{
"status": false,
"survey": {
"2018": "3.43",
"2019": "3.48",
"2020": {} // this should be `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);