[英]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.chain
与R.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.