搜尋

首頁  >  問答  >  主體

當展平巢狀物件時消除TypeScript錯誤

我正在為公司製作一個編輯表單,我的團隊中有人決定在沒有徵求其他團隊成員意見的情況下更改我們的API負載返回格式,現在我們正在努力追趕。

由於我們需要將值回傳到資料庫的API呼叫沒有設定為嵌套對象,我需要將其展平以便於操作值並提交。

這是新的巢狀結構:

{
       "status": 1, 
       "data" : {
            "name": "Tank",
            "dimensions": "2.0 x 2.5 x 4.0"
       }
    }

我需要將其轉換回像這樣的結構:

{
       "status": 1, 
       "name": "Tank",
       "dimensions": "2.0 x 22.5 x 4.0"
    }

我在網路上找到了多種解決方案,但它們都為我報了相同的TypeScript錯誤:

「for (... in ...) 語句必須使用 if 語句進行篩選」

#我還發現很多解決方案都在嵌套元素的前面嵌入了第一個元素的名稱,像這樣:

{
       "status": 1, 
       "data.name": "Tank",
       "data.dimensions": "2.0 x 22.5 x 4.0"
    }

有人可以給我展示如何重寫這個展平函數,以消除TS錯誤並且不將第一級元素的名稱附加到其嵌套元素上,使我得到一個簡單的單層物件嗎?

這是我的展平函數:

const obj = values;

const flattenObj = (ob) => {
  // 包含最终结果的对象
  const result = {};
  // 遍历对象“ob”
  for (const i in ob) {
      // 使用typeof()函数检查i的类型,并递归调用函数
      if ((typeof ob[i]) === 'object' && !Array.isArray(ob[i])) {
          const temp = flattenObj(ob[i]);
          for (const j in temp) {
              // 将temp存储在result中
              result[i + '.' + j] = temp[j];
          }
      }
      // 否则直接将ob[i]存储在result中
      else {
          result[i] = ob[i];
      }
  }
  return result;
};

console.log(flattenObj(ob));

P粉388945432P粉388945432327 天前610

全部回覆(1)我來回復

  • P粉976737101

    P粉9767371012024-01-11 00:55:24

    你可以將

    for (const i in ob) { .. }

    改成

    for (const [i, obi] of Object.entries(ob)) { // use obi instead of ob[i] }

    這樣你完全不會觸碰原型的內容。

    回覆
    0
  • 取消回覆