首页 > 解决方案 > 如何使用 Lodash 对 JSON 数据进行子级过滤

问题描述

我有以下 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'
}] } ];  

这里所有的节点都显示了哪些有campaignType: 3. Lodash 或纯基于 java 脚本的解决方案将起作用。

标签: javascriptjsonlodash

解决方案


您可以使用reduce它来查找具有3.result项的对象campaignType,如果找到,则将它们推送到累加器数组:

const getOutput = () => {
  const output = arr.reduce((a, item) => {
    const foundResults = item.result.filter(({ campaignType }) => campaignType === 3);
    if (foundResults.length) {
      a.push({ ...item, result: foundResults });
    }
    return a;
  }, []);
  console.log(output);
};

const arr = [{
    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'
      }
    ]
  }
];
getOutput();


推荐阅读