我正在尝试使用ramda
完成以下操作:
这里是array
外观的示例:
[
{
id: 1,
value: "ON",
type: "TYPE_1"
},
{
id: 1,
value: "OFF",
type: "TYPE_1"
},
{
id: 2,
value: "ON",
type: "TYPE_1"
}, {
id: 3,
value: "OFF",
type: "TYPE_2"
},
{
id: 3,
value: "OFF",
type: "TYPE_2"
},
{
id: 3,
value: "OFF",
type: "TYPE_2"
}
]
这是我想要的样子:
[
{
name: "TYPE_1"
enabled: 2,
disabled: 0,
},
{
name: "TYPE_2",
enabled: 0,
disabled: 1
}
]
基本上,我需要按type
和id
分组,在此可以重复它们的组合,但只占一个。
这是我已经尝试过的:
pipe(
groupBy(prop('type')),
map(applySpec({
name: pipe(head, prop('type')),
enabled: reduce((acc, item) => item.value === "ON" ? add(acc, 1) : acc, 0),
disabled: reduce((acc, item) => item.value === "OFF" ? add(acc, 1) : acc, 0)
})),
values,
)(list)
但是它不起作用,因为它返回以下内容:
[
{
name: "TYPE_1",
enabled: 2,
disabled: 1
},
{
type: "TYPE_2",
enabled: 0,
disabled: 3
]
缺少的部分将是仅考虑每个id
的每个type
。
您需要再次按id
分组,从每个子组中取出头部,展平,然后应用规格:
const { pipe, groupBy, prop, values, map, head, applySpec, filter, propEq, length } = R
const fn = pipe(
groupBy(prop('type')),
values,
map(pipe(
groupBy(prop('id')),
values,
map(head),
applySpec({
name: pipe(head, prop('type')),
enabled: pipe(filter(propEq('value', 'ON')), length),
disabled: pipe(filter(propEq('value', 'OFF')), length),
})
)),
)
const arr = [{"id":1,"value":"ON","type":"TYPE_1"},{"id":1,"value":"OFF","type":"TYPE_1"},{"id":2,"value":"ON","type":"TYPE_1"},{"id":3,"value":"OFF","type":"TYPE_2"},{"id":3,"value":"OFF","type":"TYPE_2"},{"id":3,"value":"OFF","type":"TYPE_2"}]
const result = fn(arr)
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.0/ramda.js"></script>
尝试一下:
const transform = applySpec({
name: head,
enabled: pipe(last, filter(propEq('value', 'ON')), length),
disabled: pipe(last, filter(propEq('value', 'OFF')), length),
})
const fn = pipe(groupBy(prop('type')), toPairs, map(transform))