簡體   English   中英

我如何 map 一個對象數組,里面也有一個對象數組?

[英]How do I map an array of objects, that also have an array of objects inside it?

我正在使用 TypeScript,我對它有點新手。 我有一個這樣的數組,但每次加載時應用程序都不知道“orderBreakdownList”(“8”和“向上趨勢”)中的鍵。

{
  "userId": "00bdad66",
  "totalNumberOfOrders": 5,
  "totalNumberOfPackages": 54521,
  "totalNumberOfItems": 13,
  "totalNumberOfDeliveredOrders": 3,
  "totalPrice": 39409.0,
  "orderBreakdownList": [
    {
      "8": {
        "noOfItems": 1,
        "noOfPackages": 17160,
        "id": 8,
        "totalPrice": 3741.52,
        "orderItems": [
          {
            "upward-trending": {
              "tag": "upward-trending",
              "value": 6653.16,
              "price": 18798.89,
              "id": 76
            }
          }
        ]
      }
    }
  ]
}

我正在嘗試渲染其中包含對象的“orderBreakdownList”數組,並將第二個數組渲染到列表中。 (單項數據下拉表)

這是我到目前為止嘗試過的,

<div>
      {orderBreakdownList.map((items, index) => {
        return (
          <ol key={index}>
            {items.map((subItems, sIndex) => {
              return <li key={sIndex}> {subItems} </li>;
            })}
          </ol>
        );
     })}
</div>

但是我沒有讓它工作,也沒有從中獲取任何數據。 也許我需要另一個 map 進去? 我需要一些幫助,拜托。

編輯:根據@rantao 的建議,我想出了以下代碼。 僅使用 html 而沒有 CSS 框架。

<div>
      {orderBreakdownList.map((orderBreakdown, i) => {
        const keyName = Object.keys(orderBreakdown);
        return (
          <div key={i}>
            Order number: {keyName}
            {Object.values(orderBreakdown).map(
              (
                { noOfItems, noOfPackages, id, totalPrice, orderItems }: any,
                i
              ) => {
                return (
                  <div key={i}>
                    <div>Id: {id}</div>
                    <div>Nr. of items: {noOfItems}</div>
                    <div>Nr. of packages: {noOfPackages}</div>
                    <div>Total price:{totalPrice}</div>
                    <ul>
                      {orderItems.map((item: any) =>
                        Object.values(item).map(
                          ({ tag, value, price, id }: any) => (
                            <li key={id}>
                              <div>Id: {id}</div>
                              <div>Tag: {tag}</div>
                              <div>Value: {value}</div>
                              <div>Price: {price}</div>
                            </li>
                          )
                        )
                      )}
                    </ul>
                  </div>
                );
              }
            )}
          </div>
        );
      })}
    </div>

我假設當您說“第二個數組”時,您指的是orderBreakdownList數組中的orderItems 在那種情況下,你會做這樣的事情:

<div>
  {orderBreakdownList.map(orderBreakdown => (
    <ol>
      {Object.values(orderBreakdown).map(({ orderItems }) => (
        orderItems.map(item => (
          Object.values(item).map(({ tag, value, price, id }) => (
            <li key={id}>
              <div>{tag}</div>
              <div>{value}</div>
              <div>{price}</div>
            </li>
          )) 
        ))
      ))}
    </ol>
  ))}
</div>

Object.values()獲取 object 的值,而無需顯式定義鍵 - 在本例中為8upward-trending 如果您想知道鍵是什么,請將Object.values()替換為 Object.entries Object.entries() ,它返回包含 object 的keyvalue的元組數組。

例如:

Object.entries(item).map(([key, value]) => {
 // Map nested item
})

items是 object,您可以通過檢索 object 鍵來獲取子項目。 然后你可以從那里改進

<div>
      {orderBreakdownList.map((items, index) => {
       let keyName = Object.keys(items);
        return (
          <ol key={index}>
              <li> {items[keyName]} </li>;
          </ol>
        );
     })}
</div>

暫無
暫無

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

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