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