Метод _.flow()
создает функцию, которую вы можете извлечь и назвать. Кроме того, первая функция в потоке принимает более 1 параметра, поэтому вам не нужно передавать его явно. Поскольку _.toPairs()
является унарным, вам не нужно заключать его в функцию со стрелкой. Создание объекта немного раздражает. Я использовал _.zipObject()
, но это все еще громоздко.
Теперь вы можете использовать функцию create by _.flow()
в своей основной функции, и она довольно читабельна:
const { flow, pick, toPairs, map, partial, zipObject, omit } = _
const propsToObjs = flow(
pick,
toPairs,
pairs => map(pairs, partial(zipObject, ['name', 'value'])),
)
const fn = (data, fields) =>
map(data, currData => ({
...omit(currData, fields),
values: propsToObjs(currData, fields)
}))
const fields = ['a', 'b', 'c']
const data = [{r: 1, a: 2, b: 3, c: 4, h: 5}, {r: 4, a: 9, b: 1, c: 4, h: 5}]
const result = fn(data, fields)
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>
Используя lodash / fp, мы можем сделать функцию потока еще более приятной, поскольку функции lodash / fp автоматически каррируются и повторяются в первую очередь data-last (not обратный порядок параметров):
const { flow, pick, toPairs, map, partial, zipObject, omit } = _
const propsToObjs = flow(
pick,
toPairs,
map(zipObject(['name', 'value']))
)
const fn = fields => map(currData => ({
...omit(fields, currData),
values: propsToObjs(fields, currData)
}))
const fields = ['a', 'b', 'c']
const data = [{r: 1, a: 2, b: 3, c: 4, h: 5}, {r: 4, a: 9, b: 1, c: 4, h: 5}]
const result = fn(fields)(data)
console.log(result)
<script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>