我具有以下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()
答案 0 :(得分:3)
您实际上不需要lodash。您可以只使用Array.prototype.map
和Array.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