在尾部递归函数中将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);

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...