[英]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.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);
編輯: 作為@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.