Javascript 如何使用Lodash对JSON数据进行子级过滤

Javascript 如何使用Lodash对JSON数据进行子级过滤,javascript,json,lodash,Javascript,Json,Lodash,我有下面的JSON数据集 [ { "campaignId": 111, "campaignCategory": "Diabetes", "result": [ { "campaignType": 1, "name": "tes1" }, { "campaignType": 1, "name": "test22" }, { "cam

我有下面的JSON数据集

[
  {
    "campaignId": 111,
    "campaignCategory": "Diabetes",
    "result": [
      {
        "campaignType": 1,
        "name": "tes1"
      },
      {
        "campaignType": 1,
        "name": "test22"
      },
      {
        "campaignType": 3,
        "name": "test33"
      }
    ]
  },
  {
    "campaignId": 222,
    "campaignCategory": "Orthopedic",
    "result": [
      {
        "campaignType": 1,
        "name": "Orthopedic"
      }
    ]
  },
  {
    "campaignId": 333,
    "campaignCategory": "Cardiology",
    "result": [
      {
        "campaignType": 3,
        "name": "Cardiology"
      },
      {
        "campaignType": 1,
        "name": "Cardiology 123"
      }
    ]
  }
]
我已经厌倦了下面的过滤器,但它没有返回所需的数据

_.filter(summary, function (data) {
 return (post, _.filter(data.result, {'campaignType': 3}));
我想在应用筛选后获得以下数据

[{ campaignId: 111, campaignCategory: 'Diabetes', result: [{
  campaignType: 3, name: 'test33'
}] }, 
{ campaignId: 333, campaignCategory: 'Cardiology', result: [{
  campaignType: 3, name: 'Cardiology'
}] } ];  
这里显示的所有节点都具有以下类型:3。 Lodash或基于纯java脚本的解决方案将起作用。

您可以使用reduce查找具有.result项且活动类型为3的对象,如果找到,则将其推送到累加器数组:

常量getOutput==>{ 常量输出=arr.reducea,项=>{ const foundResults=item.result.filter{campaittype}=>campaittype==3; 如果找到,则返回长度{ a、 推送{…项,结果:foundResults}; } 返回a; }, []; console.logoutput; }; 常数arr=[{ 编号:111, 活动类别:“糖尿病”, 结果:[{ 活动类型:1, 名称:“tes1” }, { 活动类型:1, 名称:“test22” }, { 活动类型:3, 名称:“test33” }] }, { 编号:222, 活动类别:“骨科”, 结果:[{ 活动类型:1, 名称:“骨科” }] }, { 活动编号:333, 活动类别:“心脏病学”, 结果:[{ 活动类型:3, 名称:“心脏病学” }, { 活动类型:1, 名称:“心脏病123” } ] } ]; 获取输出 您可以在香草javascript中使用一些过滤器和映射

var数据=[{campaid:111,活动类别:“糖尿病”,结果:[{ 活动类型:1,名称:“tes1” },{ 活动类型:1,名称:“test22” },{ 活动类型:3,名称:“test33” }] }, {活动ID:222,活动类别:“矫形外科”,结果:[{ 活动类型:1,名称:“骨科” }] }, {活动ID:333,活动类别:“心脏病学”,结果:[{ 活动类型:3,名称:“心脏病学” }, { 活动类型:1,名称:“心脏病123” }]} ]; var res=data.filtercamp=>campaign.result.sometype=>type.campaign==3; res=res.mapcampaign=>{ campaign.result=campaign.result.filtertype=>type.campaignType==3; 回归运动; };
console.logres 如果存在ayn过滤器元素,您可以预先过滤内部结果并获取外部对象。然后获取一个具有新结果的新对象

var数据=[{campaitId:111,campaitCategory:'Diabetes',结果:[{campaitType:1,名称:'tes1'},{campaitType:1,名称:'test22'},{campaitType:3,名称:'test33'},{campaitId:222,campaitCategory:'Orthopediage',结果:[{campaitType:1,名称:'Orthopediac'},{campaitId:333,campaitCategory:'Cardiology',结果:[{campaignType:3,名称:'Cardiology'},{campaignType:1,名称:'Cardiology 123'}]}, 结果=data.reducer,o=>{ var result=o.result.filter{campaittype}=>campaittype==1; 如果result.length r.pushObject.assign{},o,{result}; 返回r; }, []; console.logresult;
.作为控制台包装器{max height:100%!important;top:0;}在我看来,您可以通过以下简单方法获得此结果:

let data=[{campaitId:111,campaitCategory:Diabetes,result:[{campaitType:1,name:tes1},{campaitType:1,name:test22},{campaitType:3,name:test33}]},{campaidId:222,campaitCategory:Orthopedialogy,result:[{campaitType:1,name:Orthopedialogy}]},{campaitId:333,campaitCategory:心脏病学,result:[{活动类型:3,名称:心脏病学},{活动类型:1,名称:心脏病学123}]] 让result=data.reducer,{result,…rest}=>{ result.forEachx=>x.campaignType==3?r.push{…rest,结果:[x]}:null 返回r }, []
console.logresultt这不是OP需要的结果。OP不想只是筛选-他希望新数组对象包含一个.result属性,该属性只包含那些.campaittype为3的对象。@Abu我根据他们的评论进行了编辑。最初读错了你的问题。某些性能,只有一个限制,上面的答案不会返回所有匹配的子节点。EX:ActivityType:1筛选器应返回所有具有ActivityType:1的子节点。您的问题未指定此项-最好在问题中包含所有要求。如果需要,请更改.find to.filter,请参阅editina,您的解决方案将返回所有匹配的子节点。只需一个请求即可修改campaignType==3到活动类型===1。