使用Lodash从嵌套数组中删除对象

时间:2020-02-23 21:55:23

标签: javascript lodash

我具有以下JSON结构:

WebElement element = new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@class='providers-list clearfix']//div[@class='data-container']")));

我想从每个商店没有该产品的某些属性的商店中删除所有产品。

如果我将其转换为平面地图,则可以很好地完成,但是随后丢失了外部对象,因为我只有一个数组,其中包含所有尚未删除的产品。

{
  "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(),但无法正常工作

最终的JSON应该如下所示:

_.transform()

1 个答案:

答案 0 :(得分:3)

您实际上不需要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);

编辑: As @Deykun pointed out,如果您想忽略没有任何有效产品的商店,则可以在{{1}中使用Array.prototype.some过滤掉商店}:

filter