Фильтрация и возврат родительского объекта с использованием цепочки lodash - PullRequest
0 голосов
/ 27 марта 2019

Я хочу использовать цепную функцию 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": []
  }
];

Я хочу отфильтровать массив «data» в пределах financeElements, а затем вернуть полный объект расходов с фильтром, примененным к «data».

Допустим, я хочу манипулировать объектом расходов и толькополучить данные об элементах 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": []
  }
]

Возможно ли это с помощью цепочки Лодаша?

1 Ответ

0 голосов
/ 27 марта 2019

Цепочка используется для преобразования структуры в несколько этапов. В вашем случае вы не хотите менять структуру. Вы можете использовать вложенные 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>
...