使用Ramda/LoDash/Undercore对嵌套属性进行唯一分组和计数
Group and Count Uniquely on Nested Properties with Ramda/LoDash/Underscore
如何对嵌套属性进行分组和计数?如果这看起来是一个非常基本的问题,我很抱歉,但老实说,我甚至不知道从哪里开始。
编辑我最初对上面的描述太模糊了,可能是因为我的英语不太好。我将在这里进一步阐述。
如何按每个产品名称进行分组,然后聚合/计数唯一嵌套项目的数量?
我的数据来源:
[
{
product_name: 'Cool Gadget',
offer_code: {name: '50off'}
},
{
product_name: 'Cool Gadget',
offer_code: {name: '50OFF'}
},
{
product_name: 'Cool Gadget',
offer_code: {name: '75OFF'}
},
{
product_name: 'Another Cool Gadget'
},
{
product_name: 'Another Cool Gadget',
offer_code: {name: '50OFF'}
},
{
product_name: 'Another Cool Gadget',
offer_code: {name: '50OFF'}
}
]
我的首选输出:
[
{
product_name: 'Cool Gadget',
count: {
'50OFF': 2,
'75OFF': 1
}
},
{
product_name: 'Another Cool Gadget',
count: {
'_default': 1,
'50OFF': 2
}
}
]
我们可以使用Ramda浏览一个解决方案。
var数据=[{product_name:"酷小工具",offer_code:{name:"50OFF"}},{product_name:"酷小工具",offer_code:{name:"50OFF"}},{product_name:"酷小工具",offer_code:{name:"75OFF"}},{product_name:"另一个很酷的小工具"},{product_name:"另一个很酷的小工具",offer_code:{name:"50OFF"}},{product_name:"另一个很酷的小工具",offer_code:{name:"50OFF"}}];
我们将从创建一个函数开始,该函数将按产品名称对产品列表进行分组。
const groupByProductName=R.groupBy(R.prop('product_name'));groupByProductName(数据);//{"另一个很酷的小工具":[{"product_name":"Another Cool Gadget"},{"offer_code":{"name":"50OFF"},"酷的小工具":[{"offer_code":{"name":"50OFF"},"product_name":"酷的小配件"}
为了帮助计算不同优惠代码的数量,我们将创建一个新函数,根据优惠代码名称(如果存在)进行分组,如果不存在,则默认为_default
。
我们可以使用此函数映射groupByProductName
生成的对象中的值。
const groupByOfferCode=R.groupBy(R.pathOr('_default',['offer_code','name']));R.map(groupByOfferCode,groupByProductName(数据));//{"另一个很酷的小工具":{"50OFF":[{"offer_code":{"name":"50FF"},"product_name":"Another Cool Gadget"},"酷小工具":{"50OFF":[{"offer_code":{"name":"50OFF"},"product_name":"酷小工具"}
一旦我们将优惠代码按名称分组,我们将创建一个新函数来交换代码数组,其中只有每个数组的长度。
const countOfferCodes=R.map(R.length);R.map(countOfferCodes,R.map(groupByOfferCode,groupByProductName(数据)));//{"另一个酷小工具":{"50OFF":2,"_default":1},"酷小工具";{
一旦我们定义了这些函数,我们就可以得到接近您想要的输出。
const process=products=>R.map(countOfferCodes,R.map(groupByOfferCode,groupByProductName(products));过程(数据);//{"另一个酷小工具":{"50OFF":2,"_default":1},"酷小工具";{
假设所有这些函数都将其输出直接提供给下一个函数的输入,则可以使用R.pipe
来声明这一点,以创建转换管道。
const过程=R.pipe(groupByProductName,R.map(groupByOfferCode),R.map(countOfferCodes));
您可能已经注意到,我们在管道中有两个R.map
函数,它们紧挨着。由于R.pipe(R.map(f), R.map(g))
必须与R.map(R.pipe(f, g))
相同的定律,我们可以通过将管道修改为以下内容来防止在列表上循环两次。
const过程=R.pipe(groupByProductName,R.map(R.pipe(groupByOfferCode,countOfferCodes)));
现在,为了将输出转换为所需的形状,我们可以创建一个函数,将对象转换为列表,并将其添加到管道的末尾。
const objToList=R.pipe(R.toPairs,R.map(R.zipObj(['product_name','count'])));
最后,我们可以在管道中添加一个函数,按照产品名称进行排序。总之:
const groupByProductName=R.groupBy(R.prop('product_name'));const groupByOfferCode=R.groupBy(R.pathOr('_default',['offer_code','name']));const countOfferCodes=R.map(R.length);const objToList=R.pipe(R.toPairs,R.map(R.zipObj(['product_name','count'])));const过程=R.pipe(groupByProductName,R.map(R.pipe(groupByOfferCode,countOfferCodes)),objToList,R.sortBy(R.prop('product_name')));过程(数据);//[{"count":{"50OFF":2,"_default":1},"product_name":"Another Cool Gadget"},{"count":{
我们完了。
相关文章:
- ng重复中的ng模型-初始化唯一作用域属性
- JavaScript-用唯一属性标识对象
- “new”关键字是在构造对象时自动设置“constructor”属性的唯一方法吗
- Ember JS如何获取具有唯一属性值的数组
- 角度:当您需要“跟踪”但您没有唯一的属性可以跟踪时,您会怎么做
- 动态删除没有唯一属性的输入字段
- 基于单个属性从数组中获取唯一对象
- 使用jQuery隐藏具有非唯一属性的元素
- Knockout.js中使用的唯一ID;对于“;单选按钮组中的标签属性
- Backbone.js在permalink集合中所有模型的唯一属性名称
- 如何检查具有唯一值的相同属性的同一类
- 页面上第二个表单所需的唯一 id 属性
- Lodash Javascript 基于唯一属性值返回元素
- 基于两个属性从 javascript 中的对象数组中获取唯一数组
- 如何使用 Wolfpack.js 测试我的 Sails.js 模型的唯一电子邮件属性
- 克隆元素,但它们必须具有“唯一属性”
- 如何通过对象的唯一属性值从数组中获取对象
- 基于每个元素预先存在的唯一属性,复制/更改多个元素的属性
- 将唯一属性关联到JavaScript中的匿名函数
- 没有数.相对于对象数组中的另一个属性的唯一属性的出现