다음 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
A의 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);
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다