javascript - Ramda - 将数组中对象的重复项与相同的键值组合起来
问题描述
我有一个对象数组,如果它们具有相同的名称,我想将它们组合起来,并将它们的 feederTeams 添加到一个数组中。
数组如下所示:
const TEAMS = [{
name: 'Liverpool',
id: '1',
feederTeam: 'Tranmere'
}, {
name: 'Liverpool',
id: '2',
feederTeam: 'Stockport'
}, {
name: 'Man Utd',
feederTeam: 'Bla',
id: '3',
}, {
name: 'Liverpool',
id: '6',
feederTeam: 'Oldham'
}]
我想用 Ramda 把它变成这样:
[{
name: 'Liverpool',
feederTeam: ['Tranmere', 'Stockport', 'Oldham']
}, {
name: 'Man Utd',
feederTeam: ['Bla'],
}]
我尝试了很多方法都没有运气。这是我最近的尝试。
R.forEach((team => R.filter(R.propEq('name', team.name), TEAMS)), TEAMS);
解决方案
由于您想将多个元素组合在一起,请使用 R.groupBy。然后从具有 R.values 的组对象中获取一个数组,并将每个组映射到所需的形式:
const { pipe, groupBy, prop, values, map, applySpec, nth } = R
const fn = pipe(
groupBy(prop('name')), // group object by the name property
values, // get an array of groups
map(applySpec({ // map each group to an object
name: pipe(nth(0), prop('name')), // take the name from the 1st object in the group
feederTeam: map(prop('feederTeam')), // collect all feedTeam props to an array
})),
)
const teams = [{"name":"Liverpool","id":"1","feederTeam":"Tranmere"},{"name":"Liverpool","id":"2","feederTeam":"Stockport"},{"name":"Man Utd","feederTeam":"Bla","id":"3"},{"name":"Liverpool","id":"6","feederTeam":"Oldham"}]
const result = fn(teams)
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.1/ramda.js" integrity="sha512-3sdB9mAxNh2MIo6YkY05uY1qjkywAlDfCf5u1cSotv6k9CZUSyHVf4BJSpTYgla+YHLaHG8LUpqV7MHctlYzlw==" crossorigin="anonymous"></script>
一个细微的变化是使用 R.mapObjIndexed 映射组的对象。在这种情况下name
,密钥(是提供给 R.applySpec 的第二个参数)。将组映射到对象后,将结果转换为具有 R.values 的数组:
const { pipe, groupBy, prop, values, mapObjIndexed, applySpec, map, nthArg } = R
const fn = pipe(
groupBy(prop('name')), // group object by the name property
mapObjIndexed(applySpec({ // map each group to an object
name: nthArg(1), // take the name from key (2nd arg)
feederTeam: map(prop('feederTeam')), // collect all feedTeam props to an array
})),
values, // convert to an array of objects
)
const teams = [{"name":"Liverpool","id":"1","feederTeam":"Tranmere"},{"name":"Liverpool","id":"2","feederTeam":"Stockport"},{"name":"Man Utd","feederTeam":"Bla","id":"3"},{"name":"Liverpool","id":"6","feederTeam":"Oldham"}]
const result = fn(teams)
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.1/ramda.js" integrity="sha512-3sdB9mAxNh2MIo6YkY05uY1qjkywAlDfCf5u1cSotv6k9CZUSyHVf4BJSpTYgla+YHLaHG8LUpqV7MHctlYzlw==" crossorigin="anonymous"></script>
推荐阅读
- java - 在本地时区独立解析 ZonedDateTime
- sql - 使用雪花函数的输入作为 From 子句
- javascript - iframe防止父后退按钮angular8
- javascript - 如何阻止 JS 代码将空格包装成跨度?
- firebase - 如何在firestore字段中插入firebase存储图像
- java - 如何使用 java.util Random 类在 2 个间隔内生成随机双精度数?
- python - Python 如何在嵌套的 JSON 上使用 JSON 转储以避免双重编码
- python - 如何将张量转换为字符串
- javascript - 计算 Otree 上每个选项的响应数
- google-apps-script - 有谁知道谷歌电子表格的发布请求限制?