簡體   English   中英

使用Ramda轉換集合

[英]Transforming collection using ramda

我想使用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的功能性,無點,咖喱風格:

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) 

R.reduceBy可用於將列表中的項目分組,然后減少具有相同鍵的每組項目。

 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 fn = R.reduceBy( (list, {metric, measure}) => R.append({[metric]: measure}, list), [], ({period_end_date, period_type}) => `${period_end_date}|${period_type}`, ) console.log(fn(vals)) 
 <script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script> 

另一種可能性是這樣的:

 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 fn = R.pipe( R.groupBy(({period_end_date, period_type}) => `${period_end_date}|${period_type}`), R.map(R.map(R.lift(R.objOf)(R.prop('metric'), R.prop('measure')))) ); console.log(fn(vals)) 
 <script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script> 

這里的關鍵點是lift objOf以便它不處理 ,而是處理值的 容器 ,在這種情況下,返回值的函數( prop('metric')prop('measure')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM