【问题标题】:Filtering and returning parent object using lodash chain使用 lodash 链过滤和返回父对象
【发布时间】:2019-03-27 13:27:20
【问题描述】:

我想使用 Lodash 链函数过滤数组嵌套的数组项,然后返回完整的父对象。

以下是我的用例中的一些虚拟数据来说明我的问题:

const capital = [
  {
    "financeCategory": "Loans",
    "financeCategoryId": "22HM6fFFwx9eK2P42Onc",
    "financeElements": [
      {
        "financeCategoryId": "22HM6fFFwx9eK2P42Onc",
        "financeElementId": "JQiqqvGEugVQuI0fN1xQ",
        "financeElementTitle": "Convertible loan",
        "data": [
          {
            "month": 1,
            "value": 100,
            "year": "2020"
          },
          {
            "month": 1,
            "value": 100,
            "year": "2019"
          },
        ],

      }
    ]
  },
  {
    "financeCategory": "Investments",
    "financeCategoryId": "JtnUsk5M4oklIFk6cAlL",
    "financeElements": [] 
  },
  {
    "financeCategory": "Ownerships Contribution",
    "financeCategoryId": "PaDhGBm5uF0PhKJ1l6WX",
    "financeElements": []
  }
];

我想过滤 FinanceElements 中的“数据”数组,然后返回完整的费用对象,并将过滤器应用于“数据”。

假设我想操作费用对象,并且只获取具有 2020 年的财务元素的数据。我尝试过这样:

const expenseFiltered: any = _.chain(expenses)
.flatMap('financeElements')
.flatMap('data')
.filter({year: '2020' as any}).value();

但这只是给了我过滤后的“数据”对象。 输出:

[{
            "month": 1,
            "value": 100,
            "year": "2020"
}]

现在我知道有一些方法可以使用它来生成包含过滤数据的完整对象,但我真的很想用一个简单的 _.chain 命令来完成此操作

期望的输出

[
  {
    "financeCategory": "Loans",
    "financeCategoryId": "22HM6fFFwx9eK2P42Onc",
    "financeElements": [
      {
        "financeCategoryId": "22HM6fFFwx9eK2P42Onc",
        "financeElementId": "JQiqqvGEugVQuI0fN1xQ",
        "financeElementTitle": "Convertible loan",
        "data": [
          {
            "month": 1,
            "value": 100,
            "year": "2020"
          }
        ],

      }
    ]
  },
  {
    "financeCategory": "Investments",
    "financeCategoryId": "JtnUsk5M4oklIFk6cAlL",
    "financeElements": [] 
  },
  {
    "financeCategory": "Ownerships Contribution",
    "financeCategoryId": "PaDhGBm5uF0PhKJ1l6WX",
    "financeElements": []
  }
]

这可以使用 lodash 链吗?

【问题讨论】:

    标签: javascript typescript lodash


    【解决方案1】:

    链用于分几个步骤转换结构。在您的情况下,您不想更改结构。您可以使用嵌套的Array.map()(或lodash 的_.map())调用来迭代和重建结构,并在内部使用_.filter() 数据:

    const capital = [{"financeCategory":"Loans","financeCategoryId":"22HM6fFFwx9eK2P42Onc","financeElements":[{"financeCategoryId":"22HM6fFFwx9eK2P42Onc","financeElementId":"JQiqqvGEugVQuI0fN1xQ","financeElementTitle":"Convertible loan","data":[{"month":1,"value":100,"year":"2020"},{"month":1,"value":100,"year":"2019"}]}]},{"financeCategory":"Investments","financeCategoryId":"JtnUsk5M4oklIFk6cAlL","financeElements":[]},{"financeCategory":"Ownerships Contribution","financeCategoryId":"PaDhGBm5uF0PhKJ1l6WX","financeElements":[]}];
    
    const expenseFiltered = capital.map(ex => ({
      ...ex,
      financeElements: ex.financeElements.map(fe => ({
        ...fe,
        data: _.filter(fe.data, { year: '2020' })
      }))
    }));
    
    console.log(expenseFiltered);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>

    【讨论】:

    • 谢谢 - 这是有道理的,然后必须这样做!只是在尝试一些东西: _.chain(capital) .values() .filter({financeElements: [{data: [{ year: '2020' }]}] as any}).value();但是,是的,只是过滤金融元素而不是数据。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2016-11-17
    • 2018-08-22
    • 2022-01-18
    • 1970-01-01
    • 2015-01-04
    • 2015-08-23
    • 2016-10-30
    相关资源
    最近更新 更多