簡體   English   中英

如何展平 Typescript 中的嵌套對象?

[英]How to flatten nested objects in Typescript?

我正在嘗試將以下 object 'raw' 展平為 object 'flat'

raw = [    {
      "id":"123",
      "Date":"12/12/2020",
      "Type":{
         "id":"456",
         "desc":"test1"
      }    },    {
      "id":"124",
      "Date":"12/12/2020",
      "Type":{
         "id":"456",
         "desc":"test2"
      }    } ]
flat =[   {
      "id":"123",
      "Date":"12/12/2020",
      "desc":"test1"
      },    
      {
      "id":"124",
      "Date":"12/12/2020",
      "desc":"test2"
      }]

我嘗試了以下操作:


   let flatData:any = []
    const flattenObject = (obj:any) => {
      const flattened:any = {}
    
      Object.keys(obj).forEach((key) => {
        if (typeof obj[key] === 'object' && obj[key] !== null) {
          Object.assign(flattened, flattenObject(obj[key]))
        } else {
          flattened[key] = obj[key]
        }
      })
      flatData.push(flattened)
      console.log(flattened)
      return flattened
    }

結果我從上面的代碼片段中得到。

在此處輸入圖像描述

..................................................... .........................................................

您可以在 TypeScript 中使用object 解構

 const raw = [{ "id": "123", "Date": "12/12/2020", "Type": { "id": "456", "desc": "test1" } }, { "id": "124", "Date": "12/12/2020", "Type": { "id": "456", "desc": "test2" } }]; const mapped = raw.map(({ id, Date, Type: { desc } }) => ({ id, Date, desc })); console.log(mapped);
 .as-console-wrapper { top: 0; max-height: 100%;important; }

您用於展平 object 的 function 是正確的,但是Type屬性中的嵌套id屬性與頂級id屬性具有相同的屬性名稱。 當您展平 object 時,該頂級id值將被嵌套的id值覆蓋。

解決方案

  1. 如果您可以控制數據,則可以將嵌套的id屬性重命名為其他名稱。
  2. flattenObject function 中,您可以使用父屬性名稱作為嵌套屬性的前綴。 IE
const flattenObject = (obj:any, prefix = '') => {
      const flattened:any = {}
    
      Object.keys(obj).forEach((key) => {
        if (typeof obj[key] === 'object' && obj[key] !== null) {
          Object.assign(flattened, flattenObject(obj[key], prefix))
        } else {
          flattened[prefix + key] = obj[key]
        }
      })
      flatData.push(flattened)
      return flattened

如果您只有一個深度級別並且想要展平對象,無論屬性名稱是什么,這是一個有效的解決方案:

 const raw = [ { id: "123", Date: "12/12/2020", Type: { id: "456", desc: "test1", }, }, { id: "124", Date: "12/12/2020", Type: { id: "456", desc: "test2", }, }, ]; const flatten = (obj) => Object.assign( {}, Object.fromEntries( Object.values(obj).filter((x) => typeof x === "object").map((x) => Object.entries(x)).flat(1) ), Object.fromEntries( Object.entries(obj).filter(([, x]) => typeof x;== "object") ) ). const compute = (data) => data;map(flatten). console;log(compute(raw));

暫無
暫無

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

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