按键值对分组,同时使用 ramda 合并重复项
Group by key value pairs whilst merging duplicates using ramda
我有一组表单错误,如下所示:
[
{
"path": "email",
"message": "email must be at least 10 characters",
},
{
"path": "email",
"message": "email must be a valid email",
},
{
"path": "password",
"message": "password must be at least 8 characters",
}
]
形状需要变换以符合表格的错误API。我想做的是使用 ramda 对其进行转换,使其最终像这样:
{
email: ["email must be at least 10 characters", "email must be a valid email"],
password: ["password must be at least 8 characters"]
}
用于实现此目的的 ramda 函数的最佳选择是什么?
使用R.pipe
(或R.compose
)创建一个按path
属性(通过R.prop
)分组的函数,然后使用R.pluck
inside R.map
获取每个组中的 message
属性:
const { pipe, groupBy, prop, map, pluck } = R
const fn = pipe(
groupBy(prop('path')),
map(pluck('message'))
)
const data = [{"path":"email","message":"email must be at least 10 characters"},{"path":"email","message":"email must be a valid email"},{"path":"password","message":"password must be at least 8 characters"}]
const result = fn(data)
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js"></script>
我有一组表单错误,如下所示:
[
{
"path": "email",
"message": "email must be at least 10 characters",
},
{
"path": "email",
"message": "email must be a valid email",
},
{
"path": "password",
"message": "password must be at least 8 characters",
}
]
形状需要变换以符合表格的错误API。我想做的是使用 ramda 对其进行转换,使其最终像这样:
{
email: ["email must be at least 10 characters", "email must be a valid email"],
password: ["password must be at least 8 characters"]
}
用于实现此目的的 ramda 函数的最佳选择是什么?
使用R.pipe
(或R.compose
)创建一个按path
属性(通过R.prop
)分组的函数,然后使用R.pluck
inside R.map
获取每个组中的 message
属性:
const { pipe, groupBy, prop, map, pluck } = R
const fn = pipe(
groupBy(prop('path')),
map(pluck('message'))
)
const data = [{"path":"email","message":"email must be at least 10 characters"},{"path":"email","message":"email must be a valid email"},{"path":"password","message":"password must be at least 8 characters"}]
const result = fn(data)
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js"></script>