簡體   English   中英

使用 Lodash 從嵌套數組中刪除對象

[英]Remove objects from nested array using Lodash

我有以下 JSON 結構:

{
  "id": 123,
  "shops": [
    {
      "shopId": 456,
      "products": [
        {
          "productId": 10001,
          "name": "abc",
          "state": "active"
        },
        {
          "productId": 10002,
          "name": "def",
          "state": "expired"
        }
      ]
    },
    {
      "shopId": 789,
      "products": [
        {
          "productId": 20001,
          "name": "qrt",
          "state": "expired"
        },
        {
          "productId": 20002,
          "name": "jbf",
          "state": "active"
        }
      ]
    }
  ]
}

我想從每個商店中刪除產品不具有某些屬性的所有產品。

如果我將它轉換為平面地圖,那么我可以做得很好,但是我丟失了外部對象,因為我只有一個包含所有尚未刪除的產品的數組。

_(shopJson.shops).map('products').flatten().map(x => {if(x.state === 'active'){return x}}).compact().value()

我嘗試了以下操作,但最終得到了一個空數組:

_(shopJson.shops).map('products').filter(x => x.state === 'active').value()

我也嘗試使用_.reduce()_.transform()但無法讓它工作

最終的 JSON 應如下所示:

{
  "id": 123,
  "shops": [
    {
      "shopId": 456,
      "products": [
        {
          "productId": 10001,
          "name": "abc",
          "state": "active"
        }
      ]
    },
    {
      "shopId": 789,
      "products": [
        {
          "productId": 20002,
          "name": "jbf",
          "state": "active"
        }
      ]
    }
  ]
}

為此,您實際上並不需要 lodash。 你可以只使用Array.prototype.mapArray.protype.filter (還有一些spread syntax來淺合並對象屬性):

 const data = {id:123,shops:[{shopId:456,products:[{productId:10001,name:"abc",state:"active"},{productId:10002,name:"def",state:"expired"}]},{shopId:789,products:[{productId:20001,name:"qrt",state:"expired"},{productId:20002,name:"jbf",state:"active"}]}]}; const result = { ...data, shops: data.shops.map((shop) => ({ ...shop, products: shop.products.filter((product) => product.state === 'active'), })), }; console.log(result);

編輯: 作為@Deykun指出,如果你想忽略不具有任何活躍產品的商店,你可以過濾出店使用Array.prototype.some在一個filter

 const data = {id:123,shops:[{shopId:456,products:[{productId:10001,name:"abc",state:"active"},{productId:10002,name:"def",state:"expired"}]},{shopId:789,products:[{productId:20001,name:"qrt",state:"expired"},{productId:20002,name:"jbf",state:"expired"}]}]}; const result = { ...data, shops: data.shops .filter((shop) => shop.products.some((product) => product.state === 'active')) .map((shop) => ({ ...shop, products: shop.products.filter((product) => product.state === 'active') })) }; console.log(result);

暫無
暫無

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

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