簡體   English   中英

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 請注意,第三個控制台條目顯示正確分配/保存為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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM