Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Ramda/LoDash/下划线对嵌套属性进行唯一分组和计数_Javascript_Underscore.js_Lodash_Ramda.js - Fatal编程技术网

Javascript 使用Ramda/LoDash/下划线对嵌套属性进行唯一分组和计数

Javascript 使用Ramda/LoDash/下划线对嵌套属性进行唯一分组和计数,javascript,underscore.js,lodash,ramda.js,Javascript,Underscore.js,Lodash,Ramda.js,如何对嵌套属性进行分组和计数?如果这似乎是一个非常基本的问题,我表示歉意,但老实说,我甚至不知道从哪里开始 我最初对上面的描述太模糊了,可能是因为我的英语不是很好。我将在这里进一步阐述 如何按每个产品名称分组,然后聚合/计算唯一嵌套项的数量 我的数据源: [ { product_name: 'Cool Gadget', offer_code: {name: '50off'} }, { product_name: 'Cool Gadget', offer

如何对嵌套属性进行分组和计数?如果这似乎是一个非常基本的问题,我表示歉意,但老实说,我甚至不知道从哪里开始

我最初对上面的描述太模糊了,可能是因为我的英语不是很好。我将在这里进一步阐述

如何按每个产品名称分组,然后聚合/计算唯一嵌套项的数量

我的数据源:

[
  {
    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 data = [ { 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'} } ]; 一旦我们将提供代码按名称分组,我们将创建一个新函数来交换代码数组,只需使用每个数组的长度即可

const countOfferCodes = R.map(R.length); R.map(countOfferCodes, R.map(groupByOfferCode, groupByProductName(data))); // {"Another Cool Gadget": {"50OFF": 2, "_default": 1}, "Cool Gadget": {"50OFF": 2, "75OFF": 1}} 您可能已经注意到,管道中有两个相邻的R.map函数。由于法律规定R.pipeR.mapf,R.mapg必须与R.mapR.pipf,g相同,我们可以通过将管道修改为以下内容来防止在列表上循环两次

const process = R.pipe( groupByProductName, R.map(R.pipe( groupByOfferCode, countOfferCodes )) ); 现在,为了将输出转换为所需的形状,我们可以创建一个函数,将对象转换为列表,并将其添加到管道的末尾

const process = R.pipe( groupByProductName, R.map(groupByOfferCode), R.map(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 process = R.pipe( groupByProductName, R.map(R.pipe( groupByOfferCode, countOfferCodes )), objToList, R.sortBy(R.prop('product_name')) ); process(data); // [{"count": {"50OFF": 2, "_default": 1}, "product_name": "Another Cool Gadget"}, {"count": {"50OFF": 2, "75OFF": 1}, "product_name": "Cool Gadget"}]
我们已经完成了。

我们可以使用Ramda遍历一个解决方案

var data = [ { 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'} } ]; 一旦我们将提供代码按名称分组,我们将创建一个新函数来交换代码数组,只需使用每个数组的长度即可

const countOfferCodes = R.map(R.length); R.map(countOfferCodes, R.map(groupByOfferCode, groupByProductName(data))); // {"Another Cool Gadget": {"50OFF": 2, "_default": 1}, "Cool Gadget": {"50OFF": 2, "75OFF": 1}} 您可能已经注意到,管道中有两个相邻的R.map函数。由于法律规定R.pipeR.mapf,R.mapg必须与R.mapR.pipf,g相同,我们可以通过将管道修改为以下内容来防止在列表上循环两次

const process = R.pipe( groupByProductName, R.map(R.pipe( groupByOfferCode, countOfferCodes )) ); 现在,为了将输出转换为所需的形状,我们可以创建一个函数,将对象转换为列表,并将其添加到管道的末尾

const process = R.pipe( groupByProductName, R.map(groupByOfferCode), R.map(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 process = R.pipe( groupByProductName, R.map(R.pipe( groupByOfferCode, countOfferCodes )), objToList, R.sortBy(R.prop('product_name')) ); process(data); // [{"count": {"50OFF": 2, "_default": 1}, "product_name": "Another Cool Gadget"}, {"count": {"50OFF": 2, "75OFF": 1}, "product_name": "Cool Gadget"}]
我们已经完成了。

您希望根据什么进行排序???@RajanSingh按产品名称排序,然后计算有多少提供代码。我发现从输入到输出的转换中没有排序。下面斯科特·克里斯托弗的回答很好,但它只涉及分组,而不是排序。我认为这个问题结束了,因为问题的文本太宽泛了,尽管样本输出足够清晰。如果文本被编辑得更准确、更精确,它可能会被重新打开。@ScottSauyet也许我的英语不是很好。我想分组方式或聚合方式更有意义。我将进行必要的编辑。您希望根据什么进行排序???@RajanSingh按产品名称排序,然后计算有多少提供代码。我在从输入到输出的转换中没有看到排序。下面斯科特·克里斯托弗的回答很好,但它只涉及分组,而不是排序。我认为这个问题结束了,因为问题的文本太宽泛了,尽管样本输出足够清晰。如果文本被编辑得更准确、更精确,它可能会被重新打开。@ScottSauyet也许我的英语不是很好。我想分组方式或聚合方式更有意义。我会做必要的编辑。这太棒了!你应该把这个作为拉姆达的入门教程放在博客上!非常感谢。这太棒了!你应该把这个作为拉姆达的入门教程放在博客上!谢谢。