在尾部递归函数中将null分配为对象

问题描述

我有一个尾部递归函数,其目的是在任意数量的嵌套number@H_404_2@中找到任何objects@H_404_2@,然后在其上运行toFixed()@H_404_2@。

函数formatData()的工作方式是循环遍历object@H_404_2@,测试以查看当前迭代处于哪种类型的值,在该迭代上执行一个函数(toFixed())并将其保存在新值中反对或不执行任何操作,仅按原样保存值。最终结果将是一个相同的对象,但任何长的小数点后位数都被修剪为两个小数位。

在测试过程中,我发现如果null@H_404_2@中的任何级别都有一个object@H_404_2@值,则首先将其保存为null@H_404_2@,但后来将其保存为{{1 }}。我知道在JS中,object@H_404_2@的类型为null@H_404_2@,而object@H_404_2@关键字将显示此类型。

这是问题的代码笔:https://codepen.io/Danny_Wobble/pen/YzqMzxw 请注意,第三个控制台条目显示正确分配/保存为typeof@H_404_2@的值。稍后如描述的那样,最终以null@H_404_2@结束。

功能

object@H_404_2@

给出:

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
}
@H_404_2@

期望(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)
@H_404_2@

实际结果(formattedData):

{
     "status": false,"survey": {
         "2018": "3.43","2019": "3.48","2020": null,"benchmarks": {
         "company": "3.50","industry": "3.50","portfolio": "3.40",}
@H_404_2@

解决方法

您需要从对象检查中排除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);