Ramda-通过多个分组变换数组

问题描述 投票:0回答:2

我正在尝试使用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
 }
]

基本上,我需要按typeid分组,在此可以重复它们的组合,但只占一个。

这是我已经尝试过的:

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

javascript ecmascript-6 ramda.js
2个回答
2
投票

您需要再次按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>

1
投票

尝试一下:

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))

demo

© www.soinside.com 2019 - 2024. All rights reserved.