繁体   English   中英

使用 ramda 计算嵌套对象数组中的成员

[英]counting member from nested array of objects using ramda

[
    {
        'members': {
            'infants': [{ 'name': 'A' }],
            'adults': [{ 'name': 'B' }, { 'name': 'C' }],
            'children': [{ 'name': 'D' }],
        },
    },
    {
        'members': {
            'infants': [],
            'adults': [{ 'name': 'F' }, { 'name': 'G' }, { 'name': 'H' }],
            'children': [],
        },
    },
]

这是我的数据对象的样子

我试着像这样实现它

const travelerCounter = compose(
  length,
  unnest,
  unnest,
  map(values),
  unnest,
  pluck('members')
)

我不确定这是否是一个好的解决方案,或者我们可以用紧凑的方式编写它。 它还显示了正确的数字,但如果我尝试在 TypeScript 中使用它,我会出现 TS 错误 ts(2769)

您可以将R.chainR.values一起使用,然后展平为单个数组:

 const { compose, length, flatten, chain, values, pluck } = R const fn = compose( length, // get the length flatten, // flatten to a single array chain(values), // combine the values of all member objects pluck('members') // get members objects ) const data = [{"members":{"infants":[{"name":"A"}],"adults":[{"name":"B"},{"name":"C"}],"children":[{"name":"D"}]}},{"members":{"infants":[],"adults":[{"name":"F"},{"name":"G"},{"name":"H"}],"children":[]}}] const result = fn(data) console.log(result)
 <script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.28.0/ramda.min.js" integrity="sha512-t0vPcE8ynwIFovsylwUuLPIbdhDj6fav2prN9fEu/VYBupsmrmk9x43Hvnt+Mgn2h5YPSJOk7PMo9zIeGedD1A==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>

TS 类型:

type Members = { members: Record<string, { name: string }[]> };

const fn: (v: Members[]) => number = compose(
  length, // get the length
  flatten, // flatten to a single array
  chain(values), // combine the values of all member objects
  pluck("members") // get members objects
);

除了展平,您还可以提取长度,然后对它们求和:

 const { compose, sum, pluck, length, chain, values } = R const fn = compose( sum, // sum the lengths pluck('length'), // get the length of each members array chain(values), // combine values of all members objects pluck('members') // get members objects ) const data = [{"members":{"infants":[{"name":"A"}],"adults":[{"name":"B"},{"name":"C"}],"children":[{"name":"D"}]}},{"members":{"infants":[],"adults":[{"name":"F"},{"name":"G"},{"name":"H"}],"children":[]}}] const result = fn(data) console.log(result)
 <script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.28.0/ramda.min.js" integrity="sha512-t0vPcE8ynwIFovsylwUuLPIbdhDj6fav2prN9fEu/VYBupsmrmk9x43Hvnt+Mgn2h5YPSJOk7PMo9zIeGedD1A==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>

TS 类型——在这种情况下,TS 无法推断出 R.compose 中的类型,因此我们需要提供更详细的签名:

type Member = { name: string };
type MembersRecords = Record<string, Member[]>;
type Members = { members: MembersRecords };

const fn = compose<[Members[]], MembersRecords[], Member[][], number[], number>(
  sum, // sum the lengths
  pluck('length'), // get the length of each members array
  chain(values), // combine values of all members objects
  pluck('members') // get members objects
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM