[英]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.