javascript - 使用 ramda 转换集合

标签 javascript functional-programming ramda.js

我想使用 ramba 进行以下转换

输入集合

const vals = [
        {metric: "Sales", measure:100, period_end_date: "2021-12-31", period_type: 'Annual' },
        {metric: "EBT", measure:101,  period_end_date: "2021-12-31", period_type: 'Annual' },
        {metric: "Sales", measure:100, period_end_date: "2021-09-30", period_type: 'Qtr' },
        {metric: "EBT", measure:101,  period_end_date: "2021-09-30", period_type: 'Qtr' }
       ]

输出

 {  
   "2021-09-30|Qtr": [{"Sales": 100}, {"EBT": 101],  
   "2021-12-31|Annual": [{"Sales": 100, }, {"EBT": 101,}] 
 }

我已经非常接近这个

const keyGen = compose(objOf('key'), join('|'),  props(['period_end_date','period_type']))// + '|' + prop("period_type",o) }

const valGen = compose(apply(objOf), R.ap([R.prop('metric'), R.prop('measure')]), of )

const f4 = map(compose(apply(merge), R.ap([keyGen, valGen]), of))

const result =compose(groupBy(prop('key')),f4 ) (vals)

这给了我以下结果

{"2021-09-30|Qtr": [{"Sales": 100, "key": "2021-09-30|Qtr"}, 
                    {"EBT": 101, "key": "2021-09-30|Qtr"}], 
 "2021-12-31|Annual": [{"Sales": 100, "key": "2021-12-31|Annual"}, 
                       {"EBT": 101, "key": "2021-12-31|Annual"}]}

现在我需要从内部集合中删除key。我想知道是否有更好的选择。

最佳答案

也许您应该简化您的代码,只使用一个简单的函数来将您的集合减少到所需的输出?我使用了 Array.prototype.reduce,它很容易转换为 Ramda 的函数式、无点、柯里化(Currying)风格:

const convert = (acc, item) => {
  const name = `${item.period_end_date}|${item.period_type}`
  if (!acc[name]) acc[name] = []
  acc[name].push({ [item.metric]: item.measure })
  return acc
}

const transform = R.reduce(convert, {})
transform(vals)

没有 Ramda 的工作片段:

const vals = [{
    metric: "Sales",
    measure: 100,
    period_end_date: "2021-12-31",
    period_type: 'Annual'
  },
  {
    metric: "EBT",
    measure: 101,
    period_end_date: "2021-12-31",
    period_type: 'Annual'
  },
  {
    metric: "Sales",
    measure: 100,
    period_end_date: "2021-09-30",
    period_type: 'Qtr'
  },
  {
    metric: "EBT",
    measure: 101,
    period_end_date: "2021-09-30",
    period_type: 'Qtr'
  }
]

const result = vals.reduce((acc, item) => {
  const name = `${item.period_end_date}|${item.period_type}`
  if (!acc[name]) acc[name] = []
  acc[name].push({
    [item.metric]: item.measure
  })
  return acc
}, {})

console.log(result)

关于javascript - 使用 ramda 转换集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47104620/

相关文章:

javascript - 使用 Ramda 合并对象字段以创建新字段

javascript - Ramda.js 中的分组和求和

javascript - 语法错误: missing ) after for-loop control(JSON)

javascript - getElementById 不选择 Javascript 中的元素

reactjs - DevTools 中带有 React 钩子(Hook)的组件名称

functional-programming - 元循环评估器概念

javascript - cljs Om 与 React 组件互操作?

javascript - Three.js 为 VRML 对象的错误面着色

haskell - 作为 Monoid 实例的函数类型

ramda.js - 使用 Ramda 简化数组计算